Массив уникальный в коллекции 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

это, вероятно, не лучший вариант, и лучше делать фильтрацию на стороне базы данных, но приятно иметь варианты.


вы можете попробовать метод фильтра на красноречивых коллекциях, если это именно то, что вы хотите сделать

http://laravel.com/docs/eloquent#collections