Laravel 4 - 从Collection中获取属性数组

sev*_*rin 37 laravel eloquent laravel-4

我有一组对象.假设对象是标签:

$tags = Tag::all();
Run Code Online (Sandbox Code Playgroud)

我想为每个标签检索某个属性,比如它的名称.我当然能做到

foreach ($tags as $tag) {
    $tag_names[] = $tag->name;
}
Run Code Online (Sandbox Code Playgroud)

但这个问题是否有更为荒谬的解决方案?

有点像$tags->name

sev*_*rin 71

集合的lists方法类似于@Gadoma描述的表的方法.它返回一个数组,其中包含集合中每个项的给定属性的值.

要从我的标签集合中检索所需的名称数组,我可以使用:

$tags->lists('name');
Run Code Online (Sandbox Code Playgroud)

更新:laravel 5.2 lists替换为pluck.

$tags->pluck('name');
Run Code Online (Sandbox Code Playgroud)

更具体地说,laravel 5.2升级指南指出" lists集合,查询构建器和Eloquent查询构建器对象上pluck的方法已重命名为.方法签名保持不变."


Gad*_*oma 26

是的,你可以很容易地做到这一点.正如Laravel 4文档所述,您可以这样做

从表中检索所有行

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

foreach ($users as $user)
{
var_dump($user->name);
}
Run Code Online (Sandbox Code Playgroud)

从表中检索单行

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

var_dump($user->name);
Run Code Online (Sandbox Code Playgroud)

从一行中检索单个列

$name = DB::table('users')->where('name', 'John')->pluck('name');
Run Code Online (Sandbox Code Playgroud)

检索列值列表

$roles = DB::table('roles')->lists('title');
Run Code Online (Sandbox Code Playgroud)

此方法将返回角色标题数组. 您还可以为返回的数组指定自定义键列:

$roles = DB::table('roles')->lists('title', 'name');
Run Code Online (Sandbox Code Playgroud)

指定选择子句

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

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

$users = DB::table('users')->select('name as user_name')->get();
Run Code Online (Sandbox Code Playgroud)

编辑:

以上示例显示了如何在Laravel的流畅查询构建器的帮助下访问数据.如果您使用的是模型,可以使用Laravel的Eloquent ORM访问数据

因为Eloquent是内部使用查询构建器,所以您可以毫无问题地执行以下操作:

$tag_names = $tags->lists('tag_name_label', 'tag_name_column')->get();
Run Code Online (Sandbox Code Playgroud)

也可以用:

$tag_names = DB::table('tags')->lists('tag_name_label', 'tag_name_column')->get();
Run Code Online (Sandbox Code Playgroud)


Eri*_*bar 8

以下是我今天早上对此事进行实验的一些片段.我只希望(也许其他人知道解决方案)Collection有一个$ collection-> distinct()方法,因此我可以根据已经过滤的集合轻松生成列值列表.

思考?

我希望这些片段有助于澄清一些替代选项,用于从表,集合和Eloquent模型生成唯一值列表.

使用收藏(快乐)

/**
 * 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...
Run Code Online (Sandbox Code Playgroud)

使用雄辩模型(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');
Run Code Online (Sandbox Code Playgroud)

使用Eloquent Model PLUS缓存(最快)

/**
 * 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');
Run Code Online (Sandbox Code Playgroud)

如果你们有一个,我很想听到一些替代方案!

@ErikOnTheWeb


Jas*_*wis 5

你可以使用array_column它(它是一个 PHP 5.5 函数,但 Laravel 有一个辅助函数可以复制大部分行为)。

像这样的东西应该就足够了。

$tag_names = array_column($tags->toArray(), 'name');
Run Code Online (Sandbox Code Playgroud)