2014-10-03 65 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