Laravel 5.3 – уведомления и субнотики с разбивкой по страницам один раз?

Я могу разбивать уведомления и субнотики для пользователя notifiable_id 5 индивидуально без каких-либо проблем. Тем не менее, я пытаюсь, чтобы результаты были разбиты на страницы в одном экземпляре.

1) имя / данные таблицы БД

notifications

введите описание изображения здесь

subnotifications

введите описание изображения здесь

2) Разбиение страниц

Я могу разбивать каждое отношение, которое у меня индивидуально:

 $notifs = $user->notifications()->where('type', 'UserWasFollowed')->paginate(10); $subnotifications = $user->subnotifications()->with('notification')->paginate(10); 

Мне нужно объединить их, чтобы вернуть только один экземпляр paginate paginate(10) который имеет как уведомления, так и субнотики, поэтому что-то вроде этого, например (псевдокод):

 $allNotifs = $user->(notifications()->where('type', 'UserWasFollowed')) ->(subnotifications()->with('notification')) ->paginate(10); 

Как это можно сделать с помощью одного экземпляра страницы?

Обновление 1:

Модель пользователя

 class User extends Authenticatable { use Notifiable; use HasSubnotifications; } 

Модель субнотификации

 class Subnotification extends Model { protected $table = 'subnotifications'; // set up relation to the parent notification public function notification() { return $this->belongsTo(DatabaseNotification::class); } // Get the notifiable entity that the notification belongs to. public function notifiable() { return $this->morphTo(); } } 

Запрос для пользователя:

а. Уведомления о пользователе UserWasFollowed из таблицы notifications .

б. Субнотики из таблицы subnotifications с соответствующим уведомлением из таблицы notifications .

 $allNotifications = $user->subnotifications()->whereHas('notifications',function($query){ $query->where('type', 'UserWasFollowed'); })->with('notification')->get(); 

Имея мало информации о цели таблицы субнотирования или о том, что она делает, вы можете попробовать следующий метод:

 public function your_method_name() { /* IMPORTANT : Purpose of subnotification must be known to have a more structured query */ $collection = $user->notifications()->where('type', 'UserWasFollowed')->get()->merge($user->subnotifications()->with('notification')->get()); $currentPage = LengthAwarePaginator::resolveCurrentPage(); $perPage = 10; $currentPageData = $collection->slice($currentPage * $perPage, $perPage)->all(); $paginatedFinalCollection = new LengthAwarePaginator($currentPageData, count($collection), $perPage); return dd($paginatedFinalCollection); } 

Примечание. Говоря об эффективности, цель subnotification должна быть известна, зачем она вам нужна и как вы собираетесь использовать данные, полученные во втором запросе. Ответ на это может повлиять на $collection


РЕДАКТИРОВАТЬ
Простым способом, о котором я могу думать, является использование замыкания в вашей загруженной загрузке. Итак:

 $sn = $user->subnotifications()->with(['notification'=>function($query){ $query->where('type','UserWasFollowed'); }])->paginate(10); 

Вы можете узнать больше об этом в Laravel Eloquent Relationships в разделе « Ограничение нагрузки»


ОБНОВЛЕНИЕ 2
попробуй это

 $user->subnotifications()->whereHas('notifications',function($query){ $query->where('notification_type','UserWasFollowed'); })->with('notifications')->get(); 

Использование этого с подобной настройкой работало отлично для меня.
Примечание. Обязательно измените имена отношений на их соответствующие, если они не совпадают

ОБНОВЛЕНИЕ 3
При использовании вашей точной настройки для субнотий, указанных в соответствующем вопросе, со следующими запросами:

Notifications\TestNotification.php аналогичны примеру SomethingCoolHappen.php в примере.

Модель, канал и миграция одинаковы. Поэтому вы можете использовать их так, как они есть.
Что я сделал, чтобы получить то, что вам нужно, это следующее:

 Route::get('/step1', function () { // example - my followers $followers = App\User::first(); // notify them $x = Notification::send($followers, new TestNotification(['arg1' => 1, 'arg2' => 2])); dd($x); }); Route::get('/step2', function () { // my follower $user = App\User::find(1); $subnotifications = $user->subnotifications()->whereHas('notification',function($query){$query->where('type','App\Notifications\TestNotification');})->with('notification')->get(); //this gives you the subnotifications collection with the notification included dd($subnotifications); //get the notification linked to one entry of the collection dd($subnotifications->first()->notification()->first()); });