#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()
функции.