Laravel кажется очень приятным фреймворком PHP, в комплекте с хорошим ORM (Красноречивым). Тем не менее, ларавельные документы - это то, чего не хватает. В документе есть только основной материал.Laravel Красноречивые и сложные отношения
В любом случае, у меня есть проблема, когда дело доходит до отношений с мужчинами и моделью, когда оно охватывает более двух моделей.
Например, у меня есть следующий сценарий.
У меня есть четыре таблицы базы данных именно: users
, locations
, users_locations
, packages
. И соотношение между моделью/таблицами выглядит следующим образом:
Пользователь может принадлежать многим местоположениям и наоборот. Местоположение может иметь множество пакетов.
И мои соответствующие модели отношения следующим образом:
//User Model:
public function locations(){
return $this->belongsToMany('Location', 'users_locations', 'user_id', 'location_id');
}
//Location Model:
public function users(){
return $this->belongsToMany('User', 'users_locations', 'location_id', 'user_id');
}
public function packages(){
return $this->hasMany('Package', 'location_id');
}
//Package Model:
public function location(){
return $this->belongsTo('Location', 'location_id');
}
Что я хочу сделать?: Я хочу, чтобы все пакеты принадлежали пользователю. Пользователь относится к местоположениям, а пакеты также относятся к местоположениям. Поэтому из всех мест, принадлежащих пользователю, я хочу получить пакеты, принадлежащие этим местоположениям пользователя. Я также хочу, чтобы результирующий набор был разбит на страницы.
Я попытался следующие:
//get the logged in user ID
$userId = Auth::user()->id
//first get all the locations of the user
$locations= User::with('locations')->find($userId)->locations;
//declare an empty array to store the packages
$packages = array();
//now loop through the locations
foreach($locations as $location){
//since each location can have many packages, we also have to loop through the packages
foreach($location->packages as $package){
//store the plan in the array
$packages[] = $package;
}
}
//ok now we got the list of packages
return $packages;
проблема есть с вышеизложенным, я не могу реализовать пагинацию на упаковках. Кто-нибудь знает, как сделать это правильно и эффективно с помощью Eloquent? Или это просто невозможно?
Можете сделать 'paginate ($ page_size)' вместо этого. Есть ли ОДИН код строки с красноречием, где я мог бы получить вышеуказанные результаты? – WebNovice
Спасибо за отзыв о paginate() - я полностью забыл об этом. Что касается Eloquent, я не думаю, что вы можете сделать это с одним ударом, хотя было бы очень элегантно видеть это в будущем. В конце концов, вы всегда можете использовать Fluent и присоединяться к столам по своему усмотрению. –