Intereting Posts

Laravel Eloquent – не запускать запрос отношения, если значение столбца равно NULL или 0

У меня есть разные отношения в моих « Eloquent Models которые выглядят так:

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

Тем не менее, он будет запускать SQL-запрос, если main_image_id имеет значение null или 0, поэтому я получаю несколько запросов, подобных этому:

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

Который, очевидно, ничего не вернет, но все равно тратит ресурсы. Есть ли способ автоматически проверить это?

В настоящее время у меня есть метод, например hasMainImage() , который проверяет, что main_image_id не является нулевым, а не 0, но большая часть текущей системы уже использует отношения, и мне было интересно, могу ли я добавить проверку в отношение метод сам?

Я попробовал добавить к нему чек и вернуть null если столбец не имеет реального значения, но у меня есть Exception что он должен вернуть объект Relation. Или, если я пытаюсь загрузить его, я получаю следующую ошибку:

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'); } 

Спасибо за вашу помощь!

EDIT: Возможно, более понятный пример:

 $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 

Вы заявляете о своих отношениях в неправильном порядке.

Сущность, которая не имеет смысла сама по себе (без ее «родителя», которую вы можете сказать) должна включать отношение «принадлежит» (как указано в обратном обращении).

Для демонстрации можно сказать, что у вас есть модель User, и у вас есть много подробностей об этом пользователе, чтобы вы создали детальную модель.

Теперь модель пользователя должна иметь детальное отношение:

 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'); }