Как в laravel сделать глубокое HasManyThrough? - PullRequest
0 голосов
/ 21 мая 2018

Я создал отношения вроде этого:

Type.City.Street.House.Apartment

В этом отношении квартира должна зависеть одновременно от Дома и Типа, поэтому результат запроса sql должен быть таким:

select * from `apartments` where `apartments`.`house_id` in ('1', '2', '3') and `type_id` = '777'

Проблема в том, что отношение HasManyThrough рассматривает только два уровня, и с ним невозможно добраться до самой первой модели.

Пожалуйста, посоветуйте, как это можно сделать?

Определения моих моделей:

class Type extends Model {
    public function city() {
        return $this->hasMany('App\City');
    }
}
class City extends Model {
    public function street() {
        return $this->hasMany('App\Street');
    }
}
class Street extends Model {
    public function house() {
        return $this->hasMany('App\House');
    }
}
class House extends Model {
    public function Apartment() {
        return $this->hasMany('App\Apartment');
        //->where('type_id', '=' type.id) ?????
    }
}
class Apartment extends Model {
    public $fillable = ['house_id', 'type_id']
}

Ответы [ 2 ]

0 голосов
/ 11 июля 2018

Я создал отношения HasManyThrough с неограниченными уровнями: Репозиторий на GitHub

После установки вы можете использовать его следующим образом:

class Type extends Model {
    use \Staudenmeir\EloquentHasManyDeep\HasRelationships;

    public function Apartment() {
        return $this->hasManyDeep(Apartment::class, [City::class, Street::class, House::class])
            ->where('apartments.type_id', $this->id);
    }
}

К сожалению, это не работает с энергичной загрузкой.

0 голосов
/ 21 мая 2018

Я бы добавил отображение для house_id в Apartment модели и установил бы двунаправленное сопоставление между вашими моделями

class Apartment extends Model {
    public $fillable = ['house_id', 'type_id'];

    public function house() {
        return $this->belongsTo('App\House', 'house_id');
    }
}

class Type extends Model {
    public function city() {
        return $this->hasMany('App\City');
    }
}
class City extends Model {
    public function type() {
        return $this->belongsTo('App\Type', 'type_id');
    }
    public function street() {
        return $this->hasMany('App\Street');
    }
}
class Street extends Model {
    public function city() {
        return $this->belongsTo('App\City', 'city_id');
    }
    public function house() {
        return $this->hasMany('App\House');
    }
}
class House extends Model {
    public function street() {
        return $this->belongsTo('App\Street', 'street_id');
    }
    public function Apartment() {
        return $this->hasMany('App\Apartment');
        //->where('type_id', '=' type.id) ?????
    }
}

, после чего вы могли бы запрашивать квартиры в соответствии с вашими критериями, такими как

Apartments::whereHas('house.street.city.type', function ($query) use ($type_id) {
                $query->where('id', '=', $type_id);
            })
          ->whereHas('house', function ($query) use ($house_ids) {
                $query->whereIn('id', $house_ids);
            });

И я думаю, что нет необходимости в type_id в Apartments модели

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...