class Batch extends Eloquent {
public function coupons() {
return $this->hasMany('Coupon');
}
}
class Coupon extends Eloquent {
public function batch() {
return $this->belongsTo('Batch');
}
public function price() {
$batch = $this->batch;
return $batch->price;
}
}
$coupon->price
给了我这个错误: -
LogicException关系方法必须返回一个类型的对象 照亮\数据库\锋\关系\关系
然而,$coupon->batch->price
效果很好。
我错过了什么?
答案 0 :(得分:4)
您的问题是您定义了一种非关系方法price()
,但您将其称为关系方法(即您将其称为属性而不是方法)。
您应该使用以获得Coupon
价格的代码是:
$coupon->price();
关系事物起作用的原因(即$coupon->batch
超过$coupon->batch()
)是Laravel有一些特殊的逻辑 - 基本上它会抓住你试图访问一个属性(->batch
在这种情况下)并检查是否有相应的方法(->batch()
)。如果有一个,它会调用它并期望它返回一个关系,然后根据它是单结果关系还是多结果关系,在该关系上调用->first()
->get()
。< / p>
所以你的代码中发生的事情是你在后面调用$coupon->price
和Laravel,决定像->price()
方法一样,它必须是一种关系。它调用方法,检查它是否返回一个Laravel关系类型,如果没有,则抛出LogicException
。
一般的经验法则是:
此外,有时候有一个很好的理由将关系称为方法而不是属性 - 调用方法会返回一些可以添加查询构建器约束的内容,而调用属性可以获得所有结果。所以说Coupon
可以启用或禁用(例如),以下成立:
$batch->coupons
为您提供该批次的所有优惠券$batch->coupons()->whereEnabled(1)->get()
为您提供指定批次的所有优惠券$batch->coupons()->orderBy('order')->get()
为您提供该批次所有的优惠券,按名为order
$coupon->batch
为您提供给定优惠券的批次希望这可以解释Eloquent使用方法与关系属性之间的区别,以及为什么所有增强行为(例如您的示例中的优惠券价格,但不批量价格,这是固有行为)必须被称为方法。
答案 1 :(得分:0)
花点时间了解一下这里有什么物品。
当您致电$this->batch;
时,您不再链接关系查询 - 您实际上已经从数据库中检索了信息。为了定义该查询,您必须采用以下几种方法之一:
Coupon::with('batch.price')->get();
你当然可以用关系来做,但是现在已经很晚了,我不确定Price在这个方案中的确切位置,因为我没有看到与批处理相关的方法。大概你可以这样做:
public function price()
{
return $this->batch->price;
}
如果Price是Batch的衍生物。