web-dev-qa-db-ja.com

Laravel 4-コレクションから属性の配列を取得

オブジェクトのコレクションがあります。オブジェクトがタグであるとしましょう:

$tags = Tag::all();

名前など、タグごとに特定の属性を取得したい。もちろんできます

foreach ($tags as $tag) {
    $tag_names[] = $tag->name;
}

しかし、この問題に対するもっとひどい解決策はありますか?

何かのようなもの $tags->name

37
severin

コレクションには、@ Gadomaによって記述されたテーブルのメソッドに似たlistsメソッドがあります。コレクション内の各アイテムの特定の属性の値を含む配列を返します。

タグのコレクションから目的の名前の配列を取得するには、単に次を使用できます。

$tags->lists('name');

更新:laravel 5.2listsは置き換えられました pluck によって。

$tags->pluck('name');

より具体的には、 laravel 5.2 upgrade guide は、「[t] he lists method on the Collection、query builderおよびEloquent query builderオブジェクトの名前がpluckに変更された」と述べています。 。メソッドのシグネチャは同じままです。」

71
severin

うん、あなたはそれを素敵で簡単に行うことができます。 Laravel 4ドキュメントの状態 のように、次のことができます

テーブルからすべての行を取得する

$users = DB::table('users')->get();

foreach ($users as $user)
{
var_dump($user->name);
}

テーブルから単一の行を取得する

$user = DB::table('users')->where('name', 'John')->first();

var_dump($user->name);

行から単一の列を取得する

$name = DB::table('users')->where('name', 'John')->pluck('name');

列値のリストの取得

$roles = DB::table('roles')->lists('title');

このメソッドはロールのタイトルの配列を返します。返された配列のカスタムキー列を指定することもできます:

$roles = DB::table('roles')->lists('title', 'name');

Select句の指定

$users = DB::table('users')->select('name', 'email')->get();

$users = DB::table('users')->distinct()->get();

$users = DB::table('users')->select('name as user_name')->get();

編集:

上記の例は、LaravelのFluent Query Builderを使用してデータにアクセスする方法を示しています。モデルを使用している場合、 Laravel's Eloquent ORM でデータにアクセスできます

Eloquentはクエリビルダを内部的に使用しているため、問題なく次のことを実行できます。

$tag_names = $tags->lists('tag_name_label', 'tag_name_column')->get();

次の方法でも実行できます。

$tag_names = DB::table('tags')->lists('tag_name_label', 'tag_name_column')->get();
26
Gadoma

今朝の問題に関する私自身の実験からの抜粋をいくつか紹介します。コレクションに$ collection-> distinct()メソッドがあることを望みます(そしておそらく他の誰かが解決策を知っているかもしれません)。

考え?

これらのスニペットが、テーブル、コレクション、および雄弁モデルから一意の値のリストを生成するためのいくつかの代替オプションを明確にするのに役立つことを願っています。

コレクションの使用(ハッピー)

/**
 * Method A
 *     Store Collection to reduce queries when building multiple lists
 */
$people = Person::get();
$cities = array_unique( $people->lists('city') );
$states = array_unique( $people->lists('state') );
// etc...

Eloquent Model(Happier)を使用

/**
 * Method B
 *     Utilize the Eloquent model's methods
 *     One query per list
 */
// This will return an array of unique cities present in the list
$cities = Person::distinct()->lists('city');
$states = Person::distinct()->lists('state');

Eloquent Model PLUS Caching(Happiest)を使用

/**
 * Method C
 *     Utilize the Eloquent model's methods PLUS the built in Caching
 *     Queries only run once expiry is reached
 */
$expiry = 60; // One Hour
$cities = Person::remember($expiry)->distinct()->lists('city');
$states = Person::remember($expiry)->distinct()->lists('state');

皆さんがお持ちの方は、これに代わるものがいくつかあります。

えりか

8
Erik Aybar

これにはarray_columnを使用できます(PHP 5.5関数ですが、Laravelには、ほとんどの場合、動作を複製するヘルパー関数があります)。

このようなもので十分です。

$tag_names = array_column($tags->toArray(), 'name');
4
Jason Lewis