Laravel 4 – 从集合中获取数组属性

我有一个对象的集合。 假设对象是标签:

$tags = Tag::all(); 

我想为每个标签检索一个特定的属性,说它的名字。 当然可以

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

但是,对于这个问题,还有更多的解决办法吗?

$tags->name

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

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

 $tags->lists('name'); 

更新:laravel 5.2 lists被replacepluck

 $tags->pluck('name'); 

更具体地说, laravel 5.2升级指南指出:“在集合,查询构build器和Eloquent查询生成器对象上lists方法已被重命名为pluck ,方法签名保持不变”。

是的,你可以做的很好,很容易。 正如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'); 

这个方法将返回一个angular色标题数组。 您也可以为返回的数组指定一个自定义键列:

 $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(); 

编辑:

上面的例子展示了如何在Laravelstream利的查询构build器的帮助下访问数据。 如果您正在使用模型,则可以使用Laravel的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(); 

以下是我今天上午就此事进行实验的一些小节。 我只希望(也许别人知道解决scheme)该集合有一个$ collection-> distinct()方法,所以我可以很容易地基于已经过滤的集合生成列值的列表。

思考?

我希望这些代码片段可以帮助我们澄清一些替代选项,用于从表,集合和雄辩模型中生成唯一值列表。

使用collections(快乐)

 /** * 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... 

使用雄辩模型(更快乐)

 /** * 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'); 

使用雄辩模型PLUScaching(最快乐)

 /** * 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'); 

如果你们有一个,我很乐意听到一些替代scheme!

@ErikOnTheWeb

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

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

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