Laravel 4与下划线分隔的姓名关系不起作用

时间:2014-10-31 02:52:13

标签: php laravel laravel-4 eloquent

我有一个model关系具有这种命名:

class PurchaseOrder extends Eloquent implements IModel
{
    protected $guarded = ['id'];
    protected $table = 'purchase_orders';

    // this function has name separated by an _ or underscore
    public function purchased_items()
    {
        return $this->hasMany('PurchasedItem');
    }
}

我正在使用以下方式访问它:

$posted_po = PurchaseOrder::find($po_id);
$purchased_items = $posted_po->purchased_items->all();

上面的代码会产生错误

  

PHP致命错误:在非对象上调用成员函数all()

但不知何故改变关系的名称解决了我的问题:

public function purchasedItems()
{
    return $this->hasMany('PurchasedItem');
}

$posted_po = PurchaseOrder::find($po_id);
$purchased_items = $posted_po->purchasedItems->all();

现在,我的问题是,为什么会发生这种情况?这种行为背后的原因是什么?

1 个答案:

答案 0 :(得分:2)

Eloquent中的关系名称应该在camelCase中。 Laravel(大多数)遵守PSR-1标准,该标准规定“方法名称必须在camelCase中声明”。然而,如果作为方法调用,中的下划线的关系将工作,但在被调用为动态属性时将失败,而不会尾随()

发生这种情况的原因是,当您将关系称为属性时,Eloquent的__get方法会检查该属性是否作为模型中的属性或列存在。由于它不存在,因此它将名称转换为camelCase,然后检查是否存在具有该名称的方法。因此,它最终会在模型中查找方法purchasedItems