Массив уникальный в коллекции laravel eloquent
Не уверен, что это возможно, но я пытаюсь запустить array_unique над коллекцией элементов, которые у меня есть, чтобы удалить дубликаты. Хотя я не могу заставить его работать.
моя логика контроллера:
// init models
$jobs = Job::search();
$countries = $jobs->get()->map(function( $job ) {
return $job->country;
});
$countries = array_unique( $countries->toArray() );
хотя это получает ошибку "преобразование массива в строку"
4 ответов
вы можете иметь уникальные значения в ДБ, используя distinct
или group by
в предложении select. Но если ты ... --6-->действительно должны иметь уникальные значения в массиве объекта, вы можете сделать следующее:
$uniques = array();
foreach ($countries as $c) {
$uniques[$c->code] = $c; // Get unique country by code.
}
dd($uniques);
вы можете попробовать уникальный метод класса коллекции:
$countries = $countries->unique();
класс коллекции имеет несколько замечательных методов. Вы можете прочитать об этом в документация по API Laravel.
Я согласен, что иногда более эффективно "запрашивать" существующую коллекцию в памяти (вместо выполнения другого запроса в базе данных с использованием класса Querybuilder), например, сначала нужно подсчитать, а затем отфильтровать. В .NET LINQ вы можете запросить почти одинаково на IEnumerable (коллекция в памяти), как и в базе данных, что мне действительно нравится.
у меня была аналогичная проблема, и хотя время прошло, так как это может быть полезно кому-то сегодня.
проблема у меня была в том, что когда я позвонил unique
метод по сбору предметов не сработал, поэтому, вероятно, был принят первый ответ. Поэтому, если у вас есть модели и вы хотите удалить дубликаты на основе определенного поля, вы можете передать параметр в свой unique
метод, в этом случае это будет выглядеть так:
$countries->unique('code');
таким образом, у вас будут только страны с уникальный код. Вы можете заметить, что остается только первое значение, поэтому, если вы разрабатываете приложение корзины покупок и хотите по какой-то причине объединить тележки и хотите иметь только последние элементы, вы можете просто отменить сбор и вызвать unique
и обратить его обратно:
$countries->reverse()->unique('code')->reverse(); // it doesn't really make sense in this example though
это, вероятно, не лучший вариант, и лучше делать фильтрацию на стороне базы данных, но приятно иметь варианты.
вы можете попробовать метод фильтра на красноречивых коллекциях, если это именно то, что вы хотите сделать