【问题标题】:Laravel Error Argument 1 passed to method must be an instance of App\Model, instance of Illuminate\Database\Eloquent\Collection given传递给方法的 Laravel 错误参数 1 必须是 App\Model 的实例,给定的 Illuminate\Database\Eloquent\Collection 的实例
【发布时间】:2020-11-26 16:50:11
【问题描述】:

我有这 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;
}

这是 Coponable:

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#1 和 dd#2 中的说明到达 dd 并得到以下结果:

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

对于 dd#2:

dd($coupons->first());

【问题讨论】:

    标签: laravel eloquent many-to-many


    【解决方案1】:

    正如错误所说,方法discountedPrice()接受App\Coupon作为第一个参数,你给它一个Collection

    $coupons = collect(new Coupon);
    

    在这一行中,您正在创建一个新集合,然后您在该集合中使用 add() 优惠券,如果您使用 dd($coupons),您会发现它是 Illuminate\Support\Collection 的实例而不是 App\Coupon,因此您需要传递 App\Coupon作为第一个参数

    【讨论】:

    • 我添加了 dd 结果
    猜你喜欢
    • 1970-01-01
    • 2020-02-06
    • 2018-08-30
    • 2020-11-17
    • 2021-10-25
    • 2017-12-24
    • 2017-12-17
    • 2019-03-04
    • 1970-01-01
    相关资源
    最近更新 更多