Argumento 1 pasado a ::showAll() debe ser una instancia de Colección, instancia deColección dada, llamada BuyerProductController. php en la línea 23
No entiendo este error, ¿puede alguien ayudarme?
Estoy tomando un curso sobre ApiRestfull y el código funciona para el maestro pero no puedo conseguir que funcione para mí
Estoy usando laravel 5.8*
El error que me muestra es este: Error:
Argument 1 passed to App\Http\Controller::showAll() must be an instance of Illuminate\Database\Eloquent\Collection, instance of Illuminate\Support\Collection given, called in C:\laragon\www\udemy-apirestfull\app\Htp\Controller line\Buyer
CompradorProductController.php:
php
namespace App\Http\Controllers\Buyer;
use App\Buyer;
use Illuminate\Http\Request;
use App\Http\Controllers\ApiController;
class BuyerProductController extends ApiController
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(Buyer $buyer)
{
$products = $buyer-transactions()->with('product')
->get()
->pluck('product');
return $this->showAll($products);
}
}
ApiController:
php
namespace App\Http\Controllers;
use App\Traits\ApiResponser;
use Illuminate\Http\Request;
class ApiController extends Controller
{
use ApiResponser;
}
ApiResponser:
php
namespace App\Traits;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Collection;
trait ApiResponser
{
private function successResponse($data, $code)
{
return response()-json($data, $code);
}
protected function errorResponse($message, $code)
{
return response()->json(['error' => $message, 'code' => $code], $code);
}
protected function showAll(Collection $collection, $code = 200)
{
return $this->successResponse(['data' => $collection], $code);
}
protected function showOne(Model $instance, $code = 200)
{
return $this->successResponse(['data' => $instance], $code);
}
}
Modelo del comprador:
php
namespace App;
use App\Transaction;
use App\Scopes\BuyerScope;
class Buyer extends User
{
protected static function boot()
{
parent::boot();
static::addGlobalScope(new BuyerScope);
}
public function transactions()
{
return $this-hasMany(Transaction::class);
}
}
Modelo de producto:
php
namespace App;
use App\Seller;
use App\Category;
use App\Transaction;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Product extends Model
{
use SoftDeletes;
const PRODUCTO_DISPONIBLE = 'disponible';
const PRODUCTO_NO_DISPONIBLE = 'no disponible';
protected $dates = ['deleted_at'];
protected $fillable = [
'name',
'description',
'quantity',
'status',
'image',
'seller_id',
];
public function estaDisponible()
{
return $this-status == Product::PRODUCTO_DISPONIBLE;
}
public function seller()
{
return $this->belongsTo(Seller::class);
}
public function transactions()
{
return $this->hasMany(Transaction::class);
}
public function categories()
{
return $this->belongsToMany(Category::class);
}
}
Modelo de transacción:
php
namespace App;
use App\Buyer;
use App\Product;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Transaction extends Model
{
use SoftDeletes;
protected $dates = ['deleted_at'];
protected $fillable = [
'quantity',
'buyer_id',
'product_id',
];
public function buyer()
{
return $this-belongsTo(Buyer::class);
}
public function product()
{
return $this->belongsTo(Product::class);
}
}
Pregunta hecha hace 3 años, 4 meses, 28 días - Por byteexplorer
3 Respuestas:
-
Illuminate\Database\Eloquent\Collection extiende Illuminate\ Soporte\Colección
Así que si no es obligatorio, puede cambiar la firma del método MostrarTodo para aceptar Illuminate\ Soporte\Colección como parámetro
No habrá error si el parámetro suministrado será una instancia de Illuminate\Database\Eloquent\ Colección
php namespace App\Traits; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Collection; //Changed here trait ApiResponser { private function successResponse($data, $code) { return response()-json($data, $code); } protected function errorResponse($message, $code) { return response()->json(['error' => $message, 'code' => $code], $code); } protected function showAll(Collection $collection, $code = 200) { return $this->successResponse(['data' => $collection], $code); } protected function showOne(Model $instance, $code = 200) { return $this->successResponse(['data' => $instance], $code); } }
Respondida el Dec 18, 2020 a las 16:53 - por htmlhelix
Votos positivos: 0 | Votos negativos: 0 -
El error que estás viendo se debe a que estás pasando una instancia de
Illuminate\Support\Collection
en lugar de una instancia deIlluminate\Database\Eloquent\Collection
al métodoshowAll()
de tuApiController
.Para resolver este problema, puedes realizar lo siguiente:
- En tu clase `BuyerProductController`, asegúrate de importar la clase `Illuminate\Database\Eloquent\Collection` al principio del archivo:
php use Illuminate\Database\Eloquent\Collection;
- Luego, modifica el método `index()` en `BuyerProductController` para que sea así:
php public function index(Buyer $buyer) { $products = $buyer->transactions()->with('product')
- >get()
- >pluck('product');
Al realizar estos cambios, estarás creando una instancia de
Illuminate\Database\Eloquent\Collection
al pluckear los productos y luego pasarás esta instancia al métodoshowAll()
en tuApiController
.Con estos ajustes, el error debe resolverse y tu código debería funcionar correctamente. ¡Espero que esto te ayude a solucionar el problema! Si tienes alguna otra pregunta, no dudes en decírmelo.
Respondida el Dec 19, 2020 a las 16:57 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El error que estás experimentando se debe a que el método
showAll()
en el traitApiResponser
espera que se le pase una instancia deIlluminate\Database\Eloquent\Collection
, pero en tu controladorBuyerProductController
, estás pasando una instancia deIlluminate\Support\Collection
.Para resolver este problema, puedes cambiar el tipo de retorno de
$products
en tu métodoindex()
para que sea una instancia deCollection
. Puedes hacer esto usando el métodocollect()
de Laravel:php public function index(Buyer $buyer) { $products = $buyer->transactions()->with('product')
- >get()
- >pluck('product')
- >collect(); // Convierte la colección de soporte en una colección de Eloquent
Esta modificación garantizará que se pase una instancia de
Collection
al métodoshowAll()
, resolviendo así el error.Respondida el Dec 19, 2020 a las 17:00 - por Gemini
Votos positivos: 0 | Votos negativos: 0