#laravel #relation
Вопрос:
У меня возникла проблема при написании одного метода связи с проектом laravel.
У меня есть 2 стола:
- жители с колонками:
id
,building_id
,phone
.building_id
иphone
имеют уникальное ограничение - услуги с колонками:
id
,building_id
,phone
.building_id
иphone
не имеют уникального ограничения
У меня есть метод получить резидента из модели обслуживания:
public function resident()
{
return $this->belongsTo(Resident::class, 'phone', 'phone');
}
Когда у меня есть резиденты с одинаковыми phone
, но отличиями building_id
, резидент, возвращенный из отношения, неверен. Я попытался добавить where
предложение в отношение
public function resident()
{
return $this->belongsTo(Resident::class, 'phone', 'phone')
->where('building_id', $this->building_id);
}
Но оно возвращается null
. Похоже where
, предложение выполняется после belongsTo
выполнения отношения.
Я также получил решение, добавив условие при использовании нетерпеливой загрузки:
Service::where('building_id', $buildingId)
->with(['resident' => fn ($query) => $query->where('building_id', $buildingId)])
->get();
Таким образом, я могу получить нужного мне резидента. Но всякий раз, когда я получаю резидента из службы, я должен использовать запрос с быстрой загрузкой, чтобы сделать это. Есть ли способ сделать это resident
методом?
Комментарии:
1. вы пробовали
dd()
-инг$this->building_id
?2. Я только что проверил его, он вернулся
null
. Я попытался заменить$this->building_id
на фиксированное значение, и оно вернуло правильное значение. Интересно, почему$this->building_id
возвращаемоеnull
значение, потому что я использовал это раньше иbuilding_id
всегда имеет значение в базе данных. Может быть, это из-за нетерпеливой загрузки?3. Скорее всего, нет. Можете ли вы убедиться
building_id
, что не было внутри$hidden
массива на вашей модели?4. Да, я даже не заявляю
$hidden
в модели. Но согласно этой статье ( py4u.net/discuss/62508 ), похоже, он не может передавать параметры в отношение, если вы используете загрузку с наушника5. Я также попытался получить
resident
без нетерпеливой загрузки и$this->building_id
получил правильное значение, соответствующееservice