我有我的Eloquent
Models
看起來像這樣內的各種關係: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
做一個'with'使用額外的資源。你首先不應該這樣做,不要到處做,然後試着繞過它。 – apokryfos
'with'並不是隨處可見,只有一次加載多個模型。當只加載單個實例時,不會使用'with',並調用像'$ page-> main_image'這樣的調用。這些是我試圖在這裏優化的電話 – Giedrius
如果你這樣做,沒有額外的好處。連接將以任何方式發生,它只會返回更少的東西。我當然假設你在這裏有一對一的關係。 – apokryfos