获取模型belongsTo属性

时间:2014-02-27 06:44:13

标签: laravel laravel-4

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效果很好。

我错过了什么?

2 个答案:

答案 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的衍生物。