Как получить разницу между экземпляром построителя запросов и массивом одного и того же экземпляра

#php #laravel

#php #laravel

Вопрос:

Как получить разницу между экземпляром построителя запросов таблицы модели и массивом объектов той же модели?

     foreach ($completed_course_id as $value)
    {
        array_push($completed_courses,DB::table('courses')->where('id', $value)->first()); 
    }
    $courses = Course::all();
    $result =  array_diff($courses, $completed_courses);
  

Передача результата в виде compact возвращает «array_diff(): аргумент # 1 не является массивом»

Ответ №1:

Course::all() вернет вам IlluminateDatabaseEloquentCollection объект, который предоставляет вам огромное количество вспомогательных методов для перебора массивов.

Таким образом, вместо array_diff($courses, $completed_courses); этого вам нужно будет сначала преобразовать $courses в массив, вызвав $courses->toArray() :

 $result = array_diff($courses->toArray(), $completed_courses);
  

Кстати, то, чего пытается достичь приведенный выше код, вероятно, не сработает, поскольку вы работаете array_diff с рядом объектов! Также неэффективно выполнять цикл $completed_course_id и запрашивать его один за другим. Я предполагаю, что ваша цель здесь — получить все незавершенные курсы. Для этого вы можете просто использовать это для замены всех приведенных выше кодов:

 $result = DB::table('courses')
    ->whereNotIn('id', $completed_course_id)->get();
  

Ответ №2:

при использовании all() и get() он вернет экземпляр IlluminateDatabaseEloquentCollection . Итак, нам нужно преобразовать в массив с помощью toArray() функции.

https://laravel.com/docs/5.3/eloquent#collections