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 有啥区别

理解 Laravel 中的 hasOne() 和 belongsTo() 函数

Laravel hasOne 通过数据透视表

Laravel - Eloquent 连接