Laravel Eloquent hasOne 返回空
Posted
技术标签:
【中文标题】Laravel Eloquent hasOne 返回空【英文标题】:Laravel Eloquent hasOne returns empty 【发布时间】:2014-11-29 00:55:50 【问题描述】:我有两个名为“works”和“slides”的表,以及两个扩展 Eloquent 的类,名为“Work”和“Slide”。 在我的“作品”表中,我有一个“id”列、一个“标题”列、一个“描述”列和一个“图像”列,在我的“幻灯片”表中,我有一个使用带有两列的外键的复合键命名为“id”和“work_id”。
这是我的数据库关系的样子:
这是我的幻灯片类的代码:
class Slide extends Eloquent
public $timestamps = false;
public function workId()
return $this->hasOne('work', 'work_id', 'id');
这是我的工作类的代码:
class Work extends Eloquent
public $timestamps = false;
在我的索引页面中,我试图通过在我的 Slide 对象中调用“workId()”方法来获取一个 Work 对象,但是它使用以下代码返回空:
$slides = Slide::all();
$works = new \Illuminate\Database\Eloquent\Collection;
foreach ($slides as $slide)
$works->push($slide->workId());
printf($works);
但是,如果我将 '$slide->workId()' 调用替换为:
Work::find($slide->work_id)
然后它找到没有问题的行。
我应该怎么做才能让函数返回 Work 对象而不是调用 Work::find()?
【问题讨论】:
【参考方案1】:Slide 属于 Work,因为 works 的外键在 slides 表内。您还使用了不正确的关系函数命名和不正确的 hasOne 语法。
你需要使用:
class Slide extends Eloquent
public $timestamps = false;
public function work()
return $this->belongsTo('Work');
//or return $this->belongsTo('Work', 'work_id', 'id');
获取属于幻灯片的作品:$slide->work
注意:您使用“association()”作为 belongsTo,而不是“push()”
【讨论】:
我明白了。对不起,我对数据库关系不太了解,但现在我明白了。感谢您的解释。 @LiamPotter 此外,我建议对该循环使用急切加载。您可以在我链接到的 URL 中找到详细信息。 这行得通,如果你想使用急切加载来提高效率:pastebin.com/mfUxD6iT以上是关于Laravel Eloquent hasOne 返回空的主要内容,如果未能解决你的问题,请参考以下文章
laravel 中的 Eloquent ORM 里,hasOne 和 belongsTo 有啥区别
Laravel - 使用 Eloquent 从连接关系模型中选择特定列
Laravel 中 BelongsTo 和 HasOne 有啥区别