在我的应用程序中,我有多个关系。用户有许多事件。许多活动有很多参与者。
例如事件模型:
public function participants()
{
return $this->belongsToMany('AppParticipant');
}
public function user()
{
return $this->belongsTo('AppUser');
}
我想获取所有用户事件参与者并对其进行分页。
$participants = $user->events->participants;
这显然是行不通的,这就是我尝试这样的事情的原因
$events = $user->events;
$participants = [];
foreach ($events as $event) {
$participants[] = $event->participants;
}
return $participants;
这在获取数据数组方面有效,但我无法使用数据库分页对其进行分页,因为它是一个数组。
有没有另一种方式可以聚集更深层次关系中的所有参与者?或者我还能如何使用拉拉维尔或流明分页?
编辑:添加迁移
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
...
});
Schema::create('events', function (Blueprint $table) {
$table->increments('id');
...
});
Schema::create('participants', function (Blueprint $table) {
$table->increments('id');
...
});
Schema::create('event_participant', function (Blueprint $table) {
$table->integer('event_id');
$table->integer('participant_id');
});
编辑2:我的解决方案:使参与者排列 Laravel 集合并添加了用于分页的宏方法,如此处回答 https://laracasts.com/discuss/channels/laravel/how-to-paginate-laravel-collection
如果您只想对分页器进行常规访问,这就是我使用的。 也许在某个时候会有所帮助。
/**
* @param $array
*
* @return IlluminatePaginationLengthAwarePaginator
*/
public static function makePaginatorForArray(array $array){
$collection = collect($array);
return self::makePaginatorForCollection($collection);
}
/**
* This should match laravel's built in Model::paginate()
*
* @param IlluminateSupportCollection $collection
*
* @return IlluminatePaginationLengthAwarePaginator
*/
public static function makePaginatorForCollection(IlluminateSupportCollection $collection){
$current_page = (request()->has('page') ? request()->page : 1) - 1;//off by 1 (make zero start)
$per_page = (request()->has('per_page') ? request()->per_page : config('pagination.per_page')) * 1;
if(env('APP_ENV') == 'testing'){
$per_page = 0;
}
if($per_page){
$page_data = $collection->slice($current_page * $per_page, $per_page)->all();
}else{
$page_data = $collection->all();
$per_page = count($page_data) + 1;
}
return new IlluminatePaginationLengthAwarePaginator(array_values($page_data), count($collection), $per_page);
}
要使用这个...
public function myControllerMethod(Request $request){
$lots_of_data = MyModel::all()->pluck('deeper_data')->flatten();
return Helpers::makePaginatorForCollection($lots_of_data);
}
HasManyThrough 关系最适合这种情况。因此,在您的用户模型中添加此方法:
public function eventsParticipants()
{
return $this->hasManyThrough('AppParticipant', 'AppEvent');
}
然后,您可以使用定义的关系获取用户事件参与者,并轻松对其进行分页。
$user = Auth::user();
$user->eventsParticipants->paginate(5);
这种情况没有本机关系。
我创建了一个HasManyThrough
关系,支持 BelongsToMany
: GitHub 上的存储库
安装后,您可以像这样使用它:
class User extends Model {
use StaudenmeirEloquentHasManyDeepHasRelationships;
public function participants() {
return $this->hasManyDeep(Participant::class, [Event::class, 'event_participant']);
}
}
$user->participants()->paginate();