1

我可以为用户 5 单独分页通知和子通知,notifiable_id没有任何问题。但是,我试图在一个实例中将结果一起分页。

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

1 回答 1

2

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

});
于 2017-05-14T18:53:02.180 回答