【问题标题】:Laravel 4 - Get Array of Attributes from CollectionLaravel 4 - 从集合中获取属性数组
【发布时间】:2013-08-08 01:51:48
【问题描述】:

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

$tags = Tag::all();

我想检索每个标签的某个属性,说出它的名称。当然可以

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

但是对于这个问题有没有更 laravelish 的解决方案?

类似$tags->name

【问题讨论】:

  • $tags->name 应该可以工作
  • 一开始我也希望如此,但事实并非如此:Undefined property: Illuminate\Database\Eloquent\Collection::$name
  • @severin $tags 是对象的集合,而不是具有 name 属性的单个对象。您需要遍历 $tags 以获取每个标签名称。从标签中获取 name 属性是没有意义的。它将如何假设您实际要打印的名称属性。

标签: laravel laravel-4 eloquent


【解决方案1】:

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

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

$tags->lists('name');

更新:laravel 5.2 开始,listspluck 取代。

$tags->pluck('name');

更具体地说,laravel 5.2 upgrade guide 声明“集合、查询构建器和 Eloquent 查询构建器对象上的 lists 方法已重命名为 pluck。方法签名保持不变。”

p>

【讨论】:

  • lists 方法是一个非常好的发现。
  • 在创建 html 选择表单的情况下,列表效果太好了:Form::select('subcategory', array(null=>'Please Choose') + $category->firstSubcategories->lists('name', 'id'))
  • @BishalPaudel 或者您可以在控制器中执行 $firsSubcategories = $category->firstSubcategories->lists('name', 'id');,然后在刀片中执行 Form::select('subcategory', array(null=>'Please Choose') +$firsSubcategories ),但都一样。
  • @自 5.2 版起已弃用。直接使用“pluck”方法。
【解决方案2】:

是的,您可以轻松轻松地做到这一点。作为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();

【讨论】:

  • 谢谢。实际上,这确实使我找到了合适的解决方案,但是您在 DB 方法和适用于集合的方法之间的回答似乎有些混淆。
  • 已根据您的评论进行编辑。问候,
  • 我认为,在您的编辑中应该是 Tag::lists('tag_name_label')->get();
【解决方案3】:

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

想法?

我希望这些 sn-ps 有助于阐明一些替代选项,用于从表、集合和 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...

使用 Eloquent 模型(更快乐)

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

【讨论】:

    【解决方案4】:

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

    这样就足够了。

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

    【讨论】:

    • 谢谢。这样可行。但是我认为lists 方法更加 laravelish。
    猜你喜欢
    • 2018-02-28
    • 2019-01-12
    • 2016-11-19
    • 2014-01-22
    • 2016-11-19
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    相关资源
    最近更新 更多