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

1

Решение

Имея не так много информации о назначении таблицы 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());

});
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]