Laravel雄辩是属于自己的

时间:2014-02-28 23:25:43

标签: php laravel-4 blade

使用Laravel 4.1,我的观点出了问题。我在两个表之间做了一个关系oneToMany。当我将此代码放在我的视图中时,我没有任何问题:

{{ $admin->admin_role()->first()->name }}

但当我试图把它缩短时laravel doc这样说:

{{ $admin->admin_role->name }}

我有一个

Trying to get property of non-object

我知道这不是一个大问题,因为我可以使用第一个选项,但如果有人有任何想法,我很乐意阅读它们!

谢谢大家

2 个答案:

答案 0 :(得分:1)

  

在我的项目中,1个角色有很多管理员

如果一个角色有很多用户,那么即使只有一个admin,它也会返回一个集合,因此以下代码会返回models的集合而您无法获得任何未指定模型的集合中的属性:

$admin->admin_role();

所以你可以使用(已经知道):

$admin->admin_role()->first()->name;
$admin->admin_role()->last()->name;
$admin->admin_role()->find(1)->name; // Assumed 1 is id (primary key)
$admin->admin_role()->get(0); // it's first, equivalent to first()
$admin->admin_role()->get(1); // second item from collection

答案 1 :(得分:0)

以下是使用模型实例的getter时的代码。

https://github.com/illuminate/database/blob/master/Eloquent/Model.php#L2249

public function getAttribute($key)
{
    $inAttributes = array_key_exists($key, $this->attributes);

    // If the key references an attribute, we can just go ahead and return the
    // plain attribute value from the model. This allows every attribute to
    // be dynamically accessed through the _get method without accessors.
    if ($inAttributes || $this->hasGetMutator($key))
    {
        return $this->getAttributeValue($key);
    }

    // If the key already exists in the relationships array, it just means the
    // relationship has already been loaded, so we'll just return it out of
    // here because there is no need to query within the relations twice.
    if (array_key_exists($key, $this->relations))
    {
        return $this->relations[$key];
    }

    // If the "attribute" exists as a method on the model, we will just assume
    // it is a relationship and will load and return results from the query
    // and hydrate the relationship's value on the "relationships" array.
    $camelKey = camel_case($key);

    if (method_exists($this, $camelKey))
    {
        return $this->getRelationshipFromMethod($key, $camelKey);
    }
}

第一个条件是false,因为admin_role不是属性,通常关系没有mutator。回退到第二块

第二个块与第一个条件false相同,因为您没有使用预先加载。回到第三个状态。

在第三个条件

    $camelKey = camel_case($key);

    if (method_exists($this, $camelKey))
    {
        return $this->getRelationshipFromMethod($key, $camelKey);
    }

$camelKey = camel_case("admin_role"); // "adminRole"

您的模型中不存在adminRole(因为您定义了admin_role)因此$admin->admin_role()返回null并且null值不是对象。< / p>