Laravel Eloquent ORM 关系命名约定

7
在 Eloquent 中定义逆关系时,你必须将动态属性的名称与你的相关模型相同吗?
class Book extends Eloquent {

    public function author()
    {
        return $this->belongsTo('Author');
    }

}

$books = Book::all()
foreach ($books as $book) {
    echo $book->author->firstname;
}

在上面的例子中,我必须称呼这个方法为author吗?还是可以起一个其他的名字?我尝试把它命名为其他名称(只是出于好奇),但它返回null,因此显示错误信息“尝试获取非对象属性”。

编辑:我通过将外键传递给belongsTo使其工作,像这样:

class Book extends Eloquent {

    public function daauthor()
    {
        return $this->belongsTo('Author', 'author_id');
    }

}

$book = Book::find(55);
dd($book->daauthor);

有人可以解释一下为什么吗?


你可以随意命名它 :). 你尝试的错误和函数名称是什么? - Sven van Zoelen
如果我将 Book::author() 改为 Book::daauthor() 并像这样调用:$book->daauthor,那么会返回 null。 - Animal Rights
我可以将我的 Eloquent 函数重命名为任何名称,我在我的 Laravel4 项目中尝试过。函数 BelongsTo() 不会对你的函数名称产生影响。也许你在代码中忽略了一些东西? - Sven van Zoelen
理论上,将Book类中的author()更改为daauthor(),然后在foreach循环中使用$book0>daauthor应该会返回一些东西。还有其他需要注意的地方吗? - Animal Rights
原来你必须传递外键的名称才能使其工作。你必须这样做吗? - Animal Rights
1个回答

6
方法 belongsTo 试图确定链接到 Author 模型的属性。为了做到这一点,Laravel 使用调用者的函数名。
因此,在您的代码中,Laravel 看到 daauthor 函数,并尝试使用 books 表中的 daauthor_id 属性来完成您的请求。由于您的书籍表没有此属性,它会失败。
通过在方法上设置 $foreignKey 可以覆盖默认行为:
public function daauthor()
{
    return $this->belongsTo('Author', 'author_id');
}

更多细节请查看\Illuminate\Database\Eloquent\Model的源代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接