#php #laravel #eloquent #eloquent-relationship
Вопрос:
Я использую модель свойств для фильтрации данных. Передача значений фильтра из интерфейса. Если фильтр не может найти совпадения результатов, поступающих из базы данных, просто пропустите фильтр. Данные также фильтруются из Модели и отношений.
Проблема:
Я хочу пропустить оператор if, если в запросе нет результата. Проблема в том, что я не использую get() при получении результатов из модели, потому что я хочу связать запрос с отношениями. И если какое-либо утверждение IF становится ложным, все данные в переменной соответствия становятся пустым массивом, потому что я не использую get(). Я хочу пропустить утверждение if, которое становится ложным.
$matches = Property::with(['media', 'address', 'customer'])-gt;where([ 'agency_id' =gt; session('agency_id'), 'purpose' =gt; $propertyRequirement-gt;purpose, 'category_id' =gt; $propertyRequirement-gt;category_id, 'sub_category_id' =gt; $propertyRequirement-gt;sub_category_id, 'urgency' =gt; $propertyRequirement-gt;urgency ]) -gt;whereRelation('address', 'city', $propertyRequirement-gt;propertyRequirementDetail-gt;city) -gt;whereBetween('price', [$propertyRequirement-gt;min_price, $propertyRequirement-gt;max_price]) -gt;whereBetween('area', [$propertyRequirement-gt;min_area, $propertyRequirement-gt;max_area]); $filterCounter = 9; if (!empty($propertyRequirement-gt;propertyRequirementDetail-gt;location) amp;amp; $matches-gt;whereRelation('address', 'location', $propertyRequirement-gt;propertyRequirementDetail-gt;location)-gt;count() gt; 0) { $matches-gt;whereRelation('address', 'location', $propertyRequirement-gt;propertyRequirementDetail-gt;location); $filterCounter ; } if ($propertyRequirement-gt;category_id === 1) { if (!empty($propertyRequirement-gt;propertyRequirementDetail-gt;min_bathrooms) amp;amp; $matches-gt;whereRelation('propertyDetail', 'bathrooms', 'gt;=', $propertyRequirement-gt;propertyRequirementDetail-gt;min_bathrooms)-gt;count() gt; 0) { $matches = $matches-gt;whereRelation('propertyDetail', 'bathrooms', 'gt;=', $propertyRequirement-gt;propertyRequirementDetail-gt;min_bathrooms); $filterCounter ; } if (!empty($propertyRequirement-gt;propertyRequirementDetail-gt;max_bathrooms) amp;amp; $matches-gt;whereRelation('propertyDetail', 'bathrooms', 'lt;=', $propertyRequirement-gt;propertyRequirementDetail-gt;max_bathrooms)-gt;count() gt; 0) { $matches = $matches-gt;whereRelation('propertyDetail', 'bathrooms', 'lt;=', $propertyRequirement-gt;propertyRequirementDetail-gt;max_bathrooms); $filterCounter ; } if (!empty($propertyRequirement-gt;propertyRequirementDetail-gt;min_rooms) amp;amp; $matches-gt;whereRelation('propertyDetail', 'rooms', 'gt;=', $propertyRequirement-gt;propertyRequirementDetail-gt;min_rooms)-gt;count() gt; 0) { $matches = $matches-gt;whereRelation('propertyDetail', 'rooms', 'gt;=', $propertyRequirement-gt;propertyRequirementDetail-gt;min_rooms); $filterCounter ; } if (!empty($propertyRequirement-gt;propertyRequirementDetail-gt;max_rooms) amp;amp; $matches-gt;whereRelation('propertyDetail', 'rooms', 'lt;=', $propertyRequirement-gt;propertyRequirementDetail-gt;max_rooms)-gt;count() gt; 0) { $matches = $matches-gt;whereRelation('propertyDetail', 'rooms', 'lt;=', $propertyRequirement-gt;propertyRequirementDetail-gt;max_rooms); $filterCounter ; } if (!empty($propertyRequirement-gt;propertyRequirementDetail-gt;parking_space) amp;amp; $matches-gt;whereRelation('propertyDetail', 'parking_space', $propertyRequirement-gt;propertyRequirementDetail-gt;parking_space)-gt;count() gt; 0) { $matches = $matches-gt;whereRelation('propertyDetail', 'parking_space', $propertyRequirement-gt;propertyRequirementDetail-gt;parking_space); $filterCounter ; } if (!empty($propertyRequirement-gt;propertyRequirementDetail-gt;year_build) amp;amp; $matches-gt;whereRelation('propertyDetail', 'year_build', $propertyRequirement-gt;propertyRequirementDetail-gt;year_build)-gt;count() gt; 0) { $matches = $matches-gt;whereRelation('propertyDetail', 'year_build', $propertyRequirement-gt;propertyRequirementDetail-gt;year_build); $filterCounter ; } } ```
Комментарии:
1. Можете ли вы использовать get() только для проверки оператора if и передать модель без get() ?
2. да, это правильный путь, почему я об этом не подумал. Спасибо, но как пропустить условие отношения, нельзя использовать get перед отношением, это произойдет из-за ошибки.
Ответ №1:
Используйте count()
для получения количества записей вашего первоначального запроса. Это будет значительно быстрее, чем при использовании -gt;get()
. Причина, по которой вам следует использовать count()
, заключается в том, что вам не нужны все данные, которые вы бы запросили get()
. Запрос только # результатов, очевидно, быстрее, чем извлечение всех данных.
Код может выглядеть следующим образом:
$matchesCount = $matches-gt;count(); if($matchesCount gt; 0){ //continue with all other if }