传递给方法的 Laravel 错误参数 1 必须是 App\Model 的实例,给定的 Illuminate\Database\Eloquent\Collection 的实例

Posted

技术标签:

【中文标题】传递给方法的 Laravel 错误参数 1 必须是 App\\Model 的实例,给定的 Illuminate\\Database\\Eloquent\\Collection 的实例【英文标题】: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());

【问题讨论】:

【参考方案1】:

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

$coupons = collect(new Coupon);

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

【讨论】:

我添加了 dd 结果

以上是关于传递给方法的 Laravel 错误参数 1 必须是 App\Model 的实例,给定的 Illuminate\Database\Eloquent\Collection 的实例的主要内容,如果未能解决你的问题,请参考以下文章

我收到此错误“传递给Illuminate Database Grammar :: parameterize()的参数1必须是类型

传递给 Illuminate\Database\Grammar::parameterize() 的 Laravel 工厂参数 1 必须是数组类型,给定字符串

从 laravel 5 升级到 laravel 5.5 导致错误参数 1 传递给 App\Exceptions\Handler::report()

Laravel 中的授权策略参数错误

传递给 GuzzleHttp\Client::send() 的参数 1 必须实现接口

Jwt身份验证错误参数3传递给Lcobucci JWT Signer Hmac :: doVerify()