标签: laravel-collection

Laravel:collect() 助手 - 设置集合类型

如果我这样做:

$obj = factory(Object::class)->make();

collect($obj);
Run Code Online (Sandbox Code Playgroud)

我返回了一个类型的集合:

Illuminate\Support\Collection
Run Code Online (Sandbox Code Playgroud)

Laravel 还允许您使用特定方法定义自己的集合。在模型中,您执行以下操作:

public function newCollection(array $models = [])
{
    return new CustomCollection($models);
}
Run Code Online (Sandbox Code Playgroud)

你会CustomCollection在文件 CustomCollection.php 中创建你的,像这样开始:

class CustomCollection extends Collection
{
Run Code Online (Sandbox Code Playgroud)

我想知道如何返回类型的集合:

Illuminate\Database\Eloquent\Collection
Run Code Online (Sandbox Code Playgroud)

或者,在创建我自己的自定义集合的情况下,我怎么能返回一个类型的集合:

App\Models\CustomCollection
Run Code Online (Sandbox Code Playgroud)

我想用 collect()帮助程序或任何其他方式因为我不会出于编写 PHPUnit 测试的目的访问数据库。

==========

编辑:我factory(Object::class)->make()用来欺骗我试图放入集合的 Eloquent 对象。

如果您只是这样做factory(Object::class, 1)->make(),工厂会Object::class为您将 的单个实例滚动到 Eloquent 集合中。

phpunit laravel laravel-collection

2
推荐指数
1
解决办法
1568
查看次数

如何在 Laravel 的分页集合中使用变换

我想在 laravel 5.5 中的分页集合中使用 map 或转换,但我正在努力工作

这就是我试图做的,但getCollection不像LengthAwarePaginator我们在以前的 Laravel 版本中所做的那样可用,请参阅:如何转换分页集合

 $query = User::filter($request->all()
        ->with('applications');

    $users = $query->paginate(config('app.defaults.pageSize'))
        ->transform(function ($user, $key) {
            $user['picture'] = $user->avatar;

            return $user;
        });
Run Code Online (Sandbox Code Playgroud)

这是我收到的,但我的结果中没有分页详细信息

在此处输入图片说明

如何返回带有分页详细信息的转换后的集合?

laravel eloquent laravel-pagination laravel-collection

2
推荐指数
2
解决办法
2117
查看次数

Laravel-如何从集合中删除密钥?

我有数据如下:

[
        {
            "id": "3",
            "title": "Boruto's Photo",
            "is_lottery": 1,
            "price": 10
        },
        {
            "id": "4",
            "title": "Misuki's Photo",
            "is_lottery": 0,
            "price": 20
        }

    ]
Run Code Online (Sandbox Code Playgroud)

我想过滤哪个 is_lottery == false 从此集合中删除价格键。输出是:

[
        {
            "id": "3",
            "title": "Boruto's Photo",
            "is_lottery": 1,
            "price": 10
        },
        {
            "id": "4",
            "title": "Misuki's Photo",
            "is_lottery": 0,
        }

    ]
Run Code Online (Sandbox Code Playgroud)

laravel laravel-collection

2
推荐指数
1
解决办法
2万
查看次数

Laravel Collection 按日期分组和求和

我有一组数据需要进行处理才能生成报告

以下是提供的数据样本

$arrival_data = [
    [
        "arrival_date" => "09-Dec-2020",
        "total_amount" => "10",
        "total_traveller" => 6
    ],
    [
        "arrival_date" => "09-Dec-2020",
        "total_amount" => "20",
        "total_traveller" => 6
    ],
    [
        "arrival_date" => "10-Dec-2020",
        "total_amount" => "40",
        "total_traveller" => 3
    ]
];
Run Code Online (Sandbox Code Playgroud)

我想处理上面的数据,以便它将按“arrival_date”分组并对数据求和,以便数据显示如下

$arrival_data = [
    [
        "arrival_date" => "09-Dec-2020",
        "total_amount" => "30", // sum of 10 + 20
        "total_traveller" => 6
    ],
    [
        "arrival_date" => "10-Dec-2020",
        "total_amount" => "40",
        "total_traveller" => 3
    ]
];
Run Code Online (Sandbox Code Playgroud)

我还没有设法使用 Laravel Collection 生成预期的输出,我能得到的最接近的输出如下

{
    "09-Dec-2020": 30,
    "10-Dec-2020": …
Run Code Online (Sandbox Code Playgroud)

php arrays laravel laravel-collection

2
推荐指数
1
解决办法
2262
查看次数

Laravel Collection - 将特定项目放在最后一个位置

我有具有不同角色的数据库表,我需要收集具有角色的项目owner将放在最后。这是数据库示例:

ID 角色
1 行政
2 用户
3 用户
4 所有者
5 用户

如何使用这些数据对集合进行排序以获取具有owner最后角色的项目?我只能想到按字母顺序对其进行排序,保存到某个变量并从集合中删除具有所有者角色的记录,然后将其作为最后粘贴到集合中。但这对我来说似乎不必要地复杂,难道没有更简单的方法吗?

我需要这个的原因是因为我需要删除所有选定的用户并确保用户/所有者是最后一个。

sorting laravel eloquent laravel-collection

2
推荐指数
1
解决办法
40
查看次数

Laravel 集合采摘方法未按预期工作

我已经进入了 Laravel 的奇妙世界,目前正在研究在数据库中植入虚假数据进行测试。

我有几个想要使用的表;项目故事

故事表有列;idnameproject_id(这是项目表的外键)。

我的项目表已填充 10 个项目的列表。现在我需要用相关的随机项目填充 100 个故事。我有下面的方法。

public function run()
{
    DB::table('stories')->delete();
    DB::statement('ALTER TABLE stories AUTO_INCREMENT = 1');

    $faker = Faker::create();

    foreach(range(1, 100) as $index)
    {
        Story::create([
            'reference' => $faker->numberBetween(1, 9999),
            'name' => $faker->sentence(6),
            'project_id' => Project::orderBy(\DB::raw('RAND()'))->get()->first()->pluck('id')
        ]);
    }
}
Run Code Online (Sandbox Code Playgroud)

我不知道这是否是完成我需要的事情的最佳方式。然而,执行此代码时,每个故事的project_id 都设置为1;第一个项目的 ID。

当我在tinker中执行以下命令时...它总是返回1作为id。

Project::orderBy(\DB::raw('RAND()'))->get()->first()->pluck('id')
Run Code Online (Sandbox Code Playgroud)

但是当我在修补程序中执行下一个命令时......

Project::orderBy(\DB::raw('RAND()'))->get()->first()
Run Code Online (Sandbox Code Playgroud)

它每次都会返回一个随机项目。这很奇怪。因为如果 ->pluck() 之前的所有内容都正常工作,那么 pluck() 应该获取收集到的项目 id...对吧?这就是上面命令返回的内容。

<App\Project #000000000c385908000000000de30942> {
   id: 6,
   name: "New Bernadetteton",
   cover_photo_url: "/uploads/covers/horizon-grass.png",
   created_at: "2015-07-08 16:32:15",
   updated_at: …
Run Code Online (Sandbox Code Playgroud)

faker laravel laravel-collection laravel-artisan

1
推荐指数
1
解决办法
8065
查看次数

如何将收集结果作为带有 id 的数组获取

它应该很简单,但我遗漏了一些东西,让我们说这个简单的口才:

Post::select('id')->take(5)->get();
Run Code Online (Sandbox Code Playgroud)

我想获得带有结果 ID 的简单数组,因此它看起来像这样:

[1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

但我得到了这样的东西:

[{"id":"1"},{"id":"2"},{"id":"3"},{"id":"4"},{"id":"5"}]
Run Code Online (Sandbox Code Playgroud)

flatten() 不起作用,我得到了相同的结果:

Post::select('id')->take(5)->get()->flatten();
Run Code Online (Sandbox Code Playgroud)

http://laravel.com/docs/master/collections#method-flatten

flatten 方法将多维集合展平为单维:

我错过了什么?我记得有一种短线 Laravel 方法可以在不遍历数组并创建一个新数组的情况下获得此结果

php laravel eloquent laravel-5 laravel-collection

1
推荐指数
1
解决办法
2661
查看次数

获取 Laravel 5.2 Collection 中列名的唯一值计数

我试图从我的产品表中获取独特品牌的数量,以及来自 Laravel 集合的数量。

我能够使用产品的特定查询来做到这一点,但我现在使用集合的原因是因为我还想获得产品的产品来源(国家/地区)、条件(使用/新),我认为它使用来自一个查询的集合会更好,而不是对每个数据使用三个单独的查询。

下面的代码有效,但没有显示每个唯一品牌的计数。

这是表 在此处输入图片说明

这是我的控制器

$products = DB::table('products')
 ->select('products.*')
 ->whereNull('products.deleted_at')
 ->get();

$BrandCollection = collect($products);
$Brands = $BrandCollection->unique('Brand')->sortBy('Brand')->keyBy('Brand')->pluck('Brand');
Run Code Online (Sandbox Code Playgroud)

所以,我正在寻找的结果是

惠普 3
东芝 2
联想 1

我认为可以使用 concat 来完成集合,但由于我使用的是 Laravel 5.2,我正在寻找其他解决方案。

php laravel laravel-5 laravel-collection laravel-5.2

1
推荐指数
1
解决办法
2742
查看次数

如何使用自定义键mapWithKeys返回数组?

这是在Laravel中迭代集合的代码:

$usersData = $users->mapWithKeys(function ($item) {
    return [$item->id => array("name" => $item->name, "email" => $item->email, "id" => $item->id)];
 });
Run Code Online (Sandbox Code Playgroud)

我试图获得$usersData具有自定义key和值作为数组的数组。

但是结果我得到了:

array:1 [  0 => array:3 [    "name" => "Doctor"    "email" => "doctor@il.com"    "id" => 2  ]]
Run Code Online (Sandbox Code Playgroud)

相反,键2我有0数组元素的键。

laravel laravel-collection laravel-5.3 laravel-5.4 laravel-5.5

1
推荐指数
1
解决办法
1947
查看次数

非递归地将 Laravel Collection 转换为数组

我有一个Collection对象。我想把它变成一个array对象。不幸的是toArrayinCollection似乎递归地应用,因此我实际上得到了一个数组数组。

这是一个显示问题的示例:

$users = User::get();
$result = $users->toArray();
dd($result);
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,你得到的是一个数组数组,而不是一个 User 模型数组。

当你查看 Laravel 的源代码时,很清楚为什么会出现这个问题:

// Illuminate\Support\Collection.php

public function toArray()
{
    return array_map(function ($value) {
        return $value instanceof Arrayable ? $value->toArray() : $value;
    }, $this->items);
}
Run Code Online (Sandbox Code Playgroud)

请注意我仍然想$users成为一个Collection,因为这个例子只是一个MCVE。我只是不想toArray被递归应用。请注意,我完全了解不好的解决方法,例如重新给我的模型补水。

laravel laravel-5 laravel-collection laravel-5.6

1
推荐指数
1
解决办法
561
查看次数