Ошибка explode() ожидает, что параметр 2 будет строковым при использовании функции where

#laravel

#laravel

Вопрос:

я хочу удалить некоторые сообщения, которые имеют определенное значение ограничения, сообщения имеют 2 типа (исполнители и песни), песни принадлежат исполнителям

я получаю песни исполнителя с помощью приведенного ниже кода, но когда я использую функцию where для удаления некоторых песен, она не работает, и появляется ошибка

Ошибка :

explode() ожидает, что параметр 2 будет строкой, объект задан

Мой код

 $rel = collect([]);
foreach ($post->artists as $artist) {
   $artist_posts = $artist->getPosts->where(function ($query) {
     $query->whereNotIn('restrict', ['res1'])->orWhereNull('restrict');                  
   })->sortbydesc('id');
   $rel = $rel->concat($artist_posts->where('type', $type));
}
$col = $rel->unique('id');
  

Post.php (модель)

 ...
public function getPosts()
    {
        return $this->belongsToMany(Post::class, 'artists_posts', 'artist_id', 'post_id')->with('artists');
    }
 ...
  

Комментарии:

1. что такое $type ? кроме того, почему вы передаете замыкание в where … это Collection@where не конструктор запросов where

2. Я предполагаю, что метод отношений, который вы показываете Artist , не Post включен?

Ответ №1:

Вы не можете передать закрытие where методу of IlluminateSupportCollection . Вы вызываете не конструктор запросов where , а коллекцию.

 /**
 * Filter items by the given key value pair.
 *
 * @param  string  $key
 * @param  mixed  $operator
 * @param  mixed  $value
 * @return static
 */
public function where($key, $operator = null, $value = null)
  

Если вы хотите вызвать where конструктор запросов для выполнения запроса к базе данных, вам придется использовать фактический метод отношения, а не динамическое свойство:

  $artist_posts = $artist->getPosts()->where(function ($query) {
                                  ^^
  

Тогда вам нужно будет настроить sortbydesc orderByDesc(...) , и вам нужно будет вызвать get конструктор, чтобы получить коллекцию результатов.