2017-06-22 20 views
2

我有我的EloquentModels看起來像這樣內的各種關係:Laravel雄辯 - 不運行關係查詢,如果列值爲NULL或0

public function main_image() 
{ 
    return $this->hasOne(Media::class, 'id', 'main_image_id'); 
} 

然而,它會運行一個SQL查詢,如果main_image_id是空或0,所以我結束了一些查詢的是這樣的:

select * from `media` where `media`.`id` is null and `media`.`id` is not null limit 1 

這顯然不會返回任何東西,但還是浪費資源。有什麼方法可以自動檢查嗎?

目前我所做的是有一個方法,如hasMainImage(),檢查main_image_id是不是空的,但不是0,但很多目前的系統已經使用的關係,我想知道如果我可以添加檢查關係方法本身?

我曾嘗試添加一個檢查到它並返回null如果該列沒有實際值,但我有Exception它必須返回一個關係對象。或者,如果我試圖貪婪加載它,我收到以下錯誤:

Call to a member function addEagerConstraints() on null

public function main_image() 
{ 
    if (!$this->main_image_id) { 
     return null; 
    } 

    return $this->hasOne('App\Modules\Media\Models\Media', 'id', 'main_image_id'); 
} 

感謝您的幫助!

編輯: 一個或許更明顯的例子:

$page = Page::find(1); 
var_dump($page->main_image); // This will run a query as shown above that is guaranteed to return nothing 
// Since at this point system knows that $page->main_image_id is 0 or null, I would like to use that to not run the query and automatically set $page->main_image to null 
+0

做一個'with'使用額外的資源。你首先不應該這樣做,不要到處做,然後試着繞過它。 – apokryfos

+0

'with'並不是隨處可見,只有一次加載多個模型。當只加載單個實例時,不會使用'with',並調用像'$ page-> main_image'這樣的調用。這些是我試圖在這裏優化的電話 – Giedrius

+0

如果你這樣做,沒有額外的好處。連接將以任何方式發生,它只會返回更少的東西。我當然假設你在這裏有一對一的關係。 – apokryfos

回答

0

你在錯誤的順序聲明你的關係,Eloquent documentation是清楚這一點。

本身沒有意義的實體(沒有它的「父」,你可以說)應該包含「belongsTo」關係(正如文檔中所說的那樣)。

爲了演示可以說你有用戶模型,並且你有很多關於該用戶的細節,所以你創建了詳細模型。

現在用戶模型應該有詳細的關係:

public function detail() { 
    return $this->hasOne('App\Detail', 'user_id', 'id'); //you can see the difference here from your code sample, you have 2nd and 3rd parameter reversed 
} 

和細節模型應該有用戶關係:

public function user() 
{ 
    return $this->belongsTo('App\User'); 
} 
+0

這不是我目前的結構。我有'Page'模型和'Media'模型。 「媒體」模型是一個不包含任何其他模型的自包含模型(因爲它可以被不同模型和模型實例多次使用)。 'Page'有一個'main_image'方法(定義在quetstion中)定義了與'Media'的關係。如果我事先知道它不會返回任何內容,我不想運行SQL查詢。我不確定在'Media'模型中如何定義'belongsTo'來解決這個問題?我不需要以任何方式從「媒體」實例中訪問任何其他模型。 – Giedrius

+0

所以你使用多態關係嗎? – Kyslik

+0

不是這種情況。 'Page' Model可以將與其相關的一個'Media'作爲'main_image',但是,相同的'Media'模型可以作爲'main_image'與其他頁面相關聯,並且許多其他模型可以作爲不同種類的圖像。因此'Page'「有一個」Media對象,它在'pages'表中被引用爲'main_image_id'。我想知道我是否應該在這裏使用'belongsTo'關係?而且這是否會在運行查詢中產生任何影響?我認爲它會運行我想擺脫任何方式的SQL查詢,因爲那裏可能有一個0。 – Giedrius