Как исключить загруженный запрос в полиморфных отношениях? - PullRequest
0 голосов
/ 09 июня 2018

Допустим, это моя структура таблицы:

posts
    id - integer
    title - string
    body - text
    reviewed - boolean

videos
    id - integer
    title - string
    url - string

profileContent
    id - integer
    user_id - integer
    content_id - integer
    content_type - string

Теперь я хочу получить содержимое профиля пользователя:

$user->profileContents()
     ->latest()
     ->with(['content' => function ($query){
        //I'm not sure how to do it
     }])
     ->paginate(5);

Как мне сказать, ЕСЛИ колонка "пересмотрел "существует ли это правда?Но не имеет значения, просматриваются ли видео или нет.

Дополнительная информация:

profileContents () предоставляет мне все содержимое профиля пользователя

public function profileContents()
{
    return $this->hasManyThrough(ProfileContent::class, Profile::class);
}

и с ('content') использует для перехода к конкретным моделям:

public function content()
{
    return $this->morphTo();
}

Edit 1:

Я немного ближе кмоя цель.Я использовал GlobalScope, чтобы показывать только проверенный контент.

В сообщении:

protected static function boot()
{
    parent::boot();

    static::addGlobalScope('reviewed', function (Builder $builder) {
        $builder->where('reviewed', true);
    });
}

Но теперь у меня есть проблема, из-за которой я все еще не могу исключить пустой запрос.Я показываю вам вывод:

//ProfileContent
array:2 [
  0 => array:8 [
    "id" => 1
    "profile_id" => "1"
    "content_id" => "1"
    "content_type" => "App\Video"
    "content" => "[some array values]"
  ]
  1 => array:8 [
    "id" => 2
    "profile_id" => "1"
    "content_id" => "1"
    "content_type" => "App\Post"
    "content" => null
  ]
]

Как я могу исключить нулевой массив без потери разбитых на страницы данных (вывод должен быть 5)

1 Ответ

0 голосов
/ 09 июня 2018

Просмотрите свой вопрос еще раз, когда вы заходите в отношения, а затем снова пытаетесь загрузить отношения.Я уверен, что это то, что вы хотите:

$user->contents()
     ->latest()
     ->with(['posts' => function ($query){
      //here you add a query constrain on eagerload like:

        $query->where('reviewed', true);  
     }])
     ->paginate(5);
...