2014-09-25 26 views
0

Gallery.php:如何在不在Laravel中創建新的數據庫請求的情況下獲得belongsTo模型?

<?php 

class Gallery extends Eloquent { 

    protected $visible = array(
     'title', 
     'slug', 
     'id' 
    ); 

    public function coverImage() { 
     return $this->belongsTo('Image', 'cover_image_id'); 
    } 

} 

Image.php:

<?php 

class Image extends Eloquent { 

    protected $visible = array(
     'id', 
     'url' 
    ); 
    protected $appends = array(
     'url' 
    ); 

    public function gallery() { 
     return $this->hasOne('Gallery', 'cover_image_id'); 
    } 

    public function getUrlAttribute() { 
     $slug = $this->gallery->slug; 
     return '/images/' . $slug . '/' . $slug . '-' . $this->id . '.jpg'; 
    } 

} 

我要的是:

return Response::json(Gallery::all()->with('coverImage')->get()); 

我要每個coverImageurl屬性。它有......但是Laravel正在查詢每個畫廊的數據庫以獲得其slug,儘管由於with()方法而具有畫廊。

如何避免它?

+0

只是一個想法,但不應類畫廊或圖像的一個有hasOne相對於其他的,而不是他們兩個都有屬於? – Adimeus 2014-09-25 13:45:14

+0

@Adimeus你說得對。我編輯了我的問題。不幸的是,這並不能解決問題。我從「畫廊」中選擇*,其中對於每個「畫廊」,畫廊'.' cover_image_id' =?limit 1「。 – Craft 2014-09-25 14:00:16

回答

1

您需要了解雄辯關係是如何工作的。他們是不是雙向的。所以:

$model = Model::with('related')->first(); // loads related on model 

$model->related; // eager loaded 

// but 
$model->related->model; // not eager loaded, so requires query 

最後一行是真實的,即使$model->model指DB同一行。

話雖這麼說,你需要急於負載gallery上的圖像:

return Response::json(Gallery::with('coverImage.gallery')->get()); 
+0

好吧,這是好得多,但它會產生兩個相同的查詢。這是實現我所需要的最好且唯一的方法嗎? – Craft 2014-09-25 14:30:20

+0

這是最簡單的解決方案,只需要幾個字母的代碼。如果您擔心性能,請使用連接。 – 2014-09-25 14:42:10

相關問題