18

これが可能かどうかはわかりませんが、重複を削除するために、私が持っているアイテムのコレクションに対して array_unique を実行しようとしています。私はそれを働かせることはできませんが。

私のコントローラーロジック:

    // init models
    $jobs = Job::search();
    $countries = $jobs->get()->map(function( $job ) {

        return $job->country;
    });
    $countries = array_unique( $countries->toArray() );

これにより「配列から文字列への変換」エラーが発生しますが

4

4 に答える 4

37

Collection クラスの Unique メソッドを試すことができます。

$countries = $countries->unique();

Collection クラスには、すばらしいメソッドがいくつかあります。これについてはLaravel API documentationで読むことができます。

たとえば、最初にカウントしてからフィルタリングしたい場合など、(Querybuilder クラスを使用してデータベースに対して別のクエリを実行する代わりに) メモリ内の既存のコレクションに対して「クエリ」を実行する方が効率的な場合があることに同意します。.NET LINQ では、データベースとほぼ同じように IEnumerable (メモリ内コレクション) に対してクエリを実行できます。

于 2014-03-26T12:22:16.897 に答える
6

私は同様の問題を抱えていましたが、今日誰かに役立つかもしれないので時間が経ちました.

私が抱えていた問題は、アイテムのコレクションでメソッドを呼び出したときにunique機能しなかったことです。それがおそらく最初の回答が受け入れられた理由です。したがって、モデルがあり、特定のフィールドに基づいて重複を削除したい場合は、パラメーターをuniqueメソッドに渡すことができます。この場合は次のようになります。

$countries->unique('code');

そうすれば、一意のコードを持つ国のみが表示されます。最初の値だけが残っていることに気付くかもしれません。そのため、ショッピング カート アプリケーションを開発していて、何らかの理由でカートをマージし、最近のアイテムのみを取得したい場合は、コレクションをunique逆にして呼び出し、元に戻すことができます。

$countries->reverse()->unique('code')->reverse(); // it doesn't really make sense in this example though

これはおそらく最良のオプションではなく、データベース側でフィルタリングを行う方が適切ですが、オプションがあると便利です。

于 2016-04-14T05:40:12.013 に答える
2

distinctまたはgroup byselect句を使用して、DB結果に一意の値を含めることができます。ただし、オブジェクトの配列に対して一意の値が本当に必要な場合は、次のことができます。

$uniques = array();
foreach ($countries as $c) {
    $uniques[$c->code] = $c; // Get unique country by code.
}

dd($uniques);
于 2013-09-05T14:51:56.487 に答える
0

それがまさにあなたがやりたいことであれば、雄弁なコレクションでフィルターメソッドを試すことができます

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

于 2013-09-05T14:47:18.497 に答える