Я могу разбить на страницы уведомления и суб-уведомления для пользователя notifiable_id
5 индивидуально без проблем. Тем не менее, я пытаюсь объединить результаты в одном экземпляре.
1) БД имя таблицы / данные
notifications
subnotifications
2) нумерация страниц
Я могу разбить каждое отношение по отдельности так:
$notifs = $user->notifications()->where('type', 'UserWasFollowed')->paginate(10);
$subnotifications = $user->subnotifications()->with('notification')->paginate(10);
Мне нужно иметь возможность объединить их, чтобы вернуть только один 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();
Имея не так много информации о назначении таблицы subnotification или о том, что она делает, вы можете попробовать следующий метод:
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
РЕДАКТИРОВАТЬ
Простой способ, которым я могу придумать, — это использовать замыкание в вашей энергичной загрузке. with
Вот так :
$sn = $user->subnotifications()->with(['notification'=>function($query){
$query->where('type','UserWasFollowed');
}])->paginate(10);
Вы можете узнать больше об этом на Laravel Eloquent Отношения под Сдерживая энергичные нагрузки
ОБНОВЛЕНИЕ 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());
});
Других решений пока нет …