0
votes

I want to add product to wishlist and following repository pattern to store product id and user id of the user who wants to add product to his wishlist but when i run my code i get

Argument 1 passed to Illuminate\Database\Eloquent\Model::__construct() must be of the type array, object given, called in .... WishlistRepository.php

This is my Code:

WishlistController.php

namespace App\Http\Controllers\Site; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use 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;
    }



}
?>

view (script):

$('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

2 Answers

0
votes

You may fix it by removing this line

 $collection = collect($params); 

You don't need it : because collect will convert your array to Illuminate\Support\Collection object.

Class 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());
        }
}
0
votes
 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());
        }
    }

You are passing $collection to a model whe it's expecting array with values.

When you are making the new instance of Wishlist pass in the array as it is, instead of creating and passing a collection

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