У меня есть разные отношения в моих « 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'); }