我有一组对象。假设对象是标签:
$tags = Tag::all();
我想为每个标签检索某个属性,比如它的名称。我当然可以做到
foreach ($tags as $tag) {
$tag_names[] = $tag->name;
}
但这个问题是否有更为荒谬的解决方案?
像$tags->name
?
答案 0 :(得分:70)
集合的lists
方法类似于@Gadoma描述的表格方法。它返回一个数组,其中包含集合中每个项目的给定属性的值。
要从我的标签集合中检索所需的名称数组,我只需使用:
$tags->lists('name');
更新:从 laravel 5.2 lists
替换为pluck
。
$tags->pluck('name');
更具体地说,laravel 5.2 upgrade guide表示“集合,查询构建器和Eloquent查询构建器对象上的”{t] lists
方法已重命名为pluck
。方法签名仍然存在同样的。“
答案 1 :(得分:26)
是的,你可以很容易地做到这一点。作为Laravel 4 Documentation states,你可以做到
从表中检索所有行
$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');
指定选择条款
$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的流畅查询构建器的帮助下访问数据。如果您使用的是模型,则可以使用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();
答案 2 :(得分:8)
以下是我今天早上对此事进行实验的一些片段。我只希望(也许其他人知道解决方案)Collection有一个$ 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...
使用雄辩模型(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缓存(最快乐)
/**
* 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');
如果你们有一个,我很想听到一些替代方案!
@ErikOnTheWeb
答案 3 :(得分:4)
你可以使用array_column
(这是一个PHP 5.5函数,但是Laravel有一个辅助函数可以复制行为,大部分都是。)
这样的事情就足够了。
$tag_names = array_column($tags->toArray(), 'name');