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 de Illuminate\Database\Eloquent\Collection al método showAll() de tu ApiController.

    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');
    $products = new Collection($products); // Convertir a instancia de Eloquent Collection return $this->showAll($products); }

    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étodo showAll() en tu ApiController.

    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 trait ApiResponser espera que se le pase una instancia de Illuminate\Database\Eloquent\Collection, pero en tu controlador BuyerProductController, estás pasando una instancia de Illuminate\Support\Collection.

    Para resolver este problema, puedes cambiar el tipo de retorno de $products en tu método index() para que sea una instancia de Collection. Puedes hacer esto usando el método collect() 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
    return $this->showAll($products); }

    Esta modificación garantizará que se pase una instancia de Collection al método showAll(), resolviendo así el error.

    Respondida el Dec 19, 2020 a las 17:00 - por Gemini

    Votos positivos: 0 | Votos negativos: 0