Аргумент 1, передаваемый в Illuminate \\ Database \\ Eloquent \\ Model :: __ construct (), должен иметь тип массива, заданный объект - PullRequest
0 голосов
/ 18 февраля 2020

Я хочу добавить продукт в список желаний и следовать шаблону репозитория для хранения идентификатора продукта и идентификатора пользователя, который хочет добавить продукт в свой список желаний, но когда я запускаю свой код, я получаю

Аргумент 1 передается в Illuminate \ Database \ Eloquent \ Model :: __ construct () должен иметь массив типов, данный объект вызывается в .... WishlistRepository. php

Это мой код:

WishlistController. php

пространство имен App \ Http \ Controllers \ Site; использовать App \ Http \ Controllers \ Controller; использовать Illuminate \ Http \ Request; используйте App \ Contracts \ WishlistContract;

class WishlistController extends Controller
{
    protected $wishlistRepository;

    public function __construct(WishlistContract $wishlistRepository)
    {
        $this->wishlistRepository = $wishlistRepository;
    }

    public function show()
    {
        $wishlist  = $this->wishlistRepository->listWishlist();
        return view('site.pages.wishlist', compact('wishlist'));
    }

    public function addToWishlist(Request $request)
    {
        $productID=$request->p_id;
        $userID=auth()->user()->id;
        $data=array('product_id'=>$productID,'user_id'=>$userID);
        $wishlist  = $this->wishlistRepository->addToWishlist($data);
    }
}

WishlistContract. php

<?php
namespace App\Contracts;

/**
 * Interface WishlistContract
 * @package App\Contracts
 */
interface WishlistContract
{
    /**
     * @param string $order
     * @param string $sort
     * @param array $columns
     * @return mixed
     */
    public function listWishlist(string $order = 'id', string $sort = 'desc', array $columns = ['*']);

    /**
     * @param array $params
     * @return mixed
     */
    public function addToWishlist(array $params);

    /**
     * @param  $id
     * @return mixed
     */
    //public function deleteFromWishlist($id);

    /**
     * @param array $params
     * @return bool
     */
    //public function updateWishlist(array $params);

    }


?>

WishlistRepository. php

<?php
namespace App\Repositories;

use App\Models\Wishlist;
use App\Traits\UploadAble;
use Illuminate\Http\UploadedFile;
use App\Contracts\WishlistContract;
use Illuminate\Database\QueryException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Doctrine\Instantiator\Exception\InvalidArgumentException;

/**
 * Class WishlistRepository
 *
 * @package \App\Repositories
 */
class WishlistRepository extends BaseRepository implements WishlistContract
{
    use UploadAble;
    public function __construct(Wishlist $model)
{
    parent::__construct($model);
    $this->model = $model;
}

public function listWishlist(string $order = 'id', string $sort = 'desc', array $columns = ['*'])
{
    return $this->all($columns, $order, $sort);
}


    public function addToWishlist(array $params)
    {
        try {
            $collection = collect($params);
            $wishlist = new Wishlist($collection);
            $wishlist->save();
            return $wishlist;
        } catch (QueryException $exception) {
            throw new InvalidArgumentException($exception->getMessage());
        }
    }

    public function removefromWishlist($id)
    {
        $wishlist = $this->findAttributeById($id);

        $wishlist->delete();

        return $wishlist;
    }

    public function updateToWishlist(array $params)
    {
        $wishlist = $this->findWishlistById($params['id']);

        $collection = collect($params)->except('_token');

        $is_filterable = $collection->has('is_filterable') ? 1 : 0;
        $is_required = $collection->has('is_required') ? 1 : 0;

        $merge = $collection->merge(compact('is_filterable', 'is_required'));

        $wishlist->update($merge->all());

        return $wishlist;
    }



}
?>

просмотр (скрипт):

$('body').on('click', '.wishlist', function(e){
    e.preventDefault();
    var product_id=$(this).attr('data-wishlist');

     jQuery.ajax({

              url: "{{ url('/add-wishlist') }}",
              method: 'post',
              data: {
                 "p_id": product_id,"_token": "{{ csrf_token() }}",
              },
              success: function(result){
                // input.val(result.status);

              }});  

});

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020
 public function addToWishlist(array $params)
    {
        try {
            $collection = collect($params);
            $wishlist = new Wishlist($collection);
            $wishlist->save();
            return $wishlist;
        } catch (QueryException $exception) {
            throw new InvalidArgumentException($exception->getMessage());
        }
    }

Вы передаете $collection в model, когда он ожидает array со значениями.

Когда вы делаете новый экземпляр Wishlist передачи в массиве как есть, вместо создания и передачи коллекции

 public function addToWishlist(array $params)
    {
        try {
            return (new Wishlist($params))->save();
        } catch (QueryException $exception) {
            throw new InvalidArgumentException($exception->getMessage());
        }
    }
0 голосов
/ 18 февраля 2020

Вы можете исправить это, убрав эту строку

 $collection = collect($params); 

Вам это не нужно: потому что collect преобразует ваш массив в Illuminate\Support\Collection объект.

Класс WishlistRepository

public function addToWishlist(array $params) {
        try {

            $wishlist = new Wishlist($params);
            // OR
            // $wishlist = new Wishlist();
            // $wishlist->column = $params['column'];
            //...
            $wishlist->save();
            return $wishlist;
        } catch (QueryException $exception) {
            throw new InvalidArgumentException($exception->getMessage());
        }
}
...