2014-10-03 72 views
3

我有两张名为'works'和'slides'的表以及两个扩展名为'Work'和'Slide'的Eloquent的类。 我的'作品'表中有一个'id'列,'标题'列,'描述'列和'图像'列,并在我的'幻灯片'表中我有一个复合键使用外键与两个名为'id'和'work_id'的列。Laravel Eloquent hasOne returns empty

这是我的数据库中的关系的样子: Database Relationship

这是我的Slide类代码:

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()'方法来获得一个工作对象,但它返回空这个代码:

$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()?

回答

2

幻灯片属于工作,因为工作的外键在幻灯片表格内。您还为关系函数使用了错误的命名,并且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()” 为属于关联,而不是 “推()”

+0

我懂了。对不起,我对数据库关系不太好,但现在我明白了。感谢您的解释。 – 2014-10-03 23:11:18

+0

@LiamPotter此外,我会建议使用急切加载的循环。你可以在我链接的URL中找到详细信息。 – TonyArra 2014-10-03 23:20:06

+0

像这样? http://pastebin.com/D8stebG1 – 2014-10-03 23:39:33