传递给方法的 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()