Я могу разбивать уведомления и субнотики для пользователя 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()); });