gpt4 book ai didi

laravel - 获取模型 belongsTo 属性

转载 作者:行者123 更新时间:2023-12-04 02:08:21 25 4
gpt4 key购买 nike

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 Relationship method must return an object of type Illuminate\Database\Eloquent\Relations\Relation

但是,$coupon->batch->price 工作得很好。

我错过了什么?

最佳答案

这里的问题是您定义了一个非关系方法 price() 但您将其称为关系方法(即您将其称为属性而不是方法) .

获取优惠券的价格应该使用的代码是:

$coupon->price();

关系起作用的原因(即 $coupon->batch 而不是 $coupon->batch())是 Laravel 有一些特殊的逻辑 - 基本上它捕获您试图访问属性(在本例中为 ->batch)并检查是否有相应的方法(->batch())。如果有,它会调用它并期望它返回一个关系,然后根据该关系调用 ->get()->first()无论是单结果关系还是多结果关系。

所以在您的代码中发生的事情是您调用 $coupon->price 并且 Laravel 在幕后决定存在 ->price() 方法它必须是一种关系。它调用该方法,检查它是否返回 Laravel 关系类型之一,如果没有返回,则抛出 LogicException

一般的经验法则是这样的:

  • 如果您想要实际属性(即表中定义的任何内容)或关系查询的结果,请使用属性访问
  • 如果您想要其他任何东西(即您使用方法定义的行为),您必须直接调用该方法

此外,有时有充分的理由将关系作为方法而不是属性来调用 - 调用方法会返回一些您可以在其上添加查询构建器约束的内容,而调用属性则可以获得所有结果。所以说 Coupon 可以启用或禁用(例如),以下内容成立:

  • $batch->coupons 获取该批处理拥有的所有优惠券
  • $batch->coupons()->whereEnabled(1)->get() 获取给定批处理的所有已启用优惠券
  • $batch->coupons()->orderBy('order')->get() 获取该批处理拥有的所有优惠券,按名为 order< 的字段排序
  • $coupon->batch 获取给定优惠券的批处理

希望这能解释 Eloquent 对关系的方法和属性的使用之间的区别,以及为什么所有增强行为(例如您示例中的优惠券价格,但不是批处理价格,这是固有行为)必须作为方法调用。

关于laravel - 获取模型 belongsTo 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22060984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com