Laravel Аргумент ошибки 1, переданный методу, должен быть экземпляром App \ Model, заданным экземпляром Illuminate \ Database \ Eloquent \ Collection - PullRequest
0 голосов
/ 06 августа 2020

У меня есть эти 3 модели:

продукт

    class Product extends Model

    {
        public function categories()
        {
            return $this->belongsToMany(Category::class);
        }
        public function getPriceAttribute($price)
        {
            $categories=$this->categories;
            //dd($categories->first()->validCoupons());  //dd#1
            $coupons =collect(new Coupon);
            foreach($categoriesas $category){
             $coupons->add($category->validCoupons());
            }
             //dd($coupons->first());  //dd#2
            if ($coupons->isNotEmpty()){
              $discountCalculator = resolve(DiscountCalculator::class);
              return $discountCalculator->discountedPrice($coupons->first() ,$price);
           }

        return $price ;

    }
    }

Купон

class Coupon extends Model
{
     public function isExpired()
     {
         return Carbon::now()->isAfter(Carbon::parse($this->expire_time));
     }
}

Категория

class Category extends Model
{
    use Couponable;
}

, и это Совместимо:

trait Couponable
{
public function coupons()
{
    return $this->morphMany(Coupon::class , 'couponable');
}


public function validCoupons()
{
    return $this->coupons->where('expire_time' , '>' , Carbon::now());
}

}

, но я получаю такую ​​ошибку:

Аргумент 1, переданный в App \ Support \ Discount \ DiscountCalculator :: discountedPrice (), должен быть экземпляр App \ Coupon, экземпляр Illuminate \ Database \ Eloquent \ Collection задан

Я попадаю в dd, как указано в вопросе dd # 1 и dd # 2, и получаю следующие результаты:

dd($categories->first()->validCoupons());

first dd result

and for dd#2:

dd($coupons->first());

второй результат dd

1 Ответ

0 голосов
/ 06 августа 2020

Как сказано в ошибке, метод discountedPrice() принимает App\Coupon в качестве первого параметра, и вы дали ему Collection

$coupons = collect(new Coupon);

в этой строке вы создаете новую коллекцию, затем вы add() купонов в этой коллекции, если вы dd($coupons) найдете, что это экземпляр Illuminate\Support\Collection, а не App\Coupon, поэтому вам нужно передать App\Coupon вместо этого в качестве первого параметра

...