我试图通过$post->file->url
访问文件表上的url属性,但我得到“试图获取非对象属性”错误。我的表和模型不同,因为我不能使用File
作为模型名称。有什么遗失的吗?我希望有人能找到解决方案。这是我的桌子:
- posts:
[PK] id
title
[FK] featured_image
- files:
[PK] id
title
url
我的模特:
class TheFile extends \Eloquent
{
protected $table = 'files';
public function post() {
return $this->belongsTo('Post');
}
}
class Post extends \Eloquent
{
protected $table = 'posts';
public function file() {
return $this->hasOne('TheFile', 'id', 'featured_image');
}
}
提前感谢。
答案 0 :(得分:2)
也许我错了,但正如我所看到的,你实际上这里的关系是错误的。如果表X
有一个表Y
,那么FK字段位于Y
并且与X
上的PK相关。但是你反过来了。
因此,您需要做以下两件事之一:
更改您的数据库,将post_id
放在files
上,而不是featured_image
上的file`.`id
(点posts
}
更改您的关系以匹配您的数据库结构:
class TheFile extends \Eloquent
{
protected $table = 'files';
public function post() {
return $this->hasOne('Post');
}
}
class Post extends \Eloquent
{
protected $table = 'posts';
public function file() {
return $this->belongsTo('TheFile');
}
}
如果您不打算更改表格,显然还会对您的各种字段进行更改。
基本的经验法则是,如果一个表有FK,那么它就是'属于'表。另一张表是'有一个'或'有很多'。这个规则的一个小例外显然是“属于很多”,其中一个表可以与另一个没有FK的表相关 - 但即使这是同一规则的专用版本 - X
'有很多'{{1 }和X_Ys
'有许多'Y
和X_Ys
属于X_Y
而X
属于X_Y
。所以它真的只是语法糖。
答案 1 :(得分:2)
我将我的表名改为medias,将我的模型改为Media。然后将这些代码放入Post
模型中。其作品。表,模型和方法的名称必须相似。
public function media() {
return $this->belongsTo('Media', 'featured_image', 'id');
}