2013-02-19 57 views
2

我試圖重寫以前與Codeigniter一起使用的數據庫的一些邏輯。設計是這樣的一些的條件多到一對多聯接存儲在加盟表所示:Laravel 4雄辯:多對多的條件加入表

Table user 
    - user_id 
    ... 

Table avatars 
    - user_id 
    - image_id 
    - uploaded_timestamp 
    - deleted_timestamp 

Table images 
    - image_id 
    ... 

在這種情況下,我想通過替身與用戶相關聯的所有圖片表,按上傳時間降序排序,不包括已刪除的頭像(deleted_timestamp不爲空)。

我發現使用Eloquent的hasMany不允許加入表中的條件。什麼是最簡單的方法來實現這種影響,還是我需要求助於以我曾經使用Codeigniter的活動記錄類的方式構建完整查詢?

注:我發現this answer這表明使用->hasMany(..)->with('another_column_from_pivot_table'),但似乎只與Laravel 3雄辯的實施工作。看來 - >現在只用於eagar加載。

回答

4

hasMany()適用於一對多關係。多對多期望belongsToMany() - 這是與itermediate(「數據透視表」)關聯的語句。

我還沒有嘗試過,但我可以相信belongsToMany()不會與where()語句一起使用。我知道hasMany()對where()很好。

你可能需要做的是建立第三個模型類:

(警告:未經測試的代碼)

class User extends Eloquent { 
    public avatars() { 
     return $this->hasMany('Avatar') 
        ->where ('deleted_timestamp',0) 
        ->orderBy('uploaded_timestamp','desc'); 
    } 
} 

class Avatar extends Eloquent { 
    public image() { 
    return $this->belongsTo('Image'); 
    } 
} 

class Image extends Eloquent { 
} 

你會訪問您的圖片作爲...

$avatars = User::find($user_id)->avatars(); 
foreach ($avatars as $avatar) { 
    echo '<img src="$avatar->image->url">'; 
} 
+1

謝謝。我還發現你可以使用' - > withPivot('column_name')'來獲取從belongsToMany返回的數據透視表的列值。但正如你指出的那樣,這仍然讓我無法添加訂單以及在哪裏過濾集合。你的方法將會起作用,同時使用foreach對這個集合進行手動提取和排序,但是你的理想更爲理想。謝謝! – epocsquadron 2013-02-19 21:15:17