雄辩的关系深度



在我的应用程序中,我有多个关系。用户有许多事件。许多活动有很多参与者。

例如事件模型:

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();

相关内容

  • 没有找到相关文章

最新更新