Условие перед hasOne, относится к отношению

#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