如果我这样做:
$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 集合中。
我想在 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)
这是我收到的,但我的结果中没有分页详细信息
如何返回带有分页详细信息的转换后的集合?
我有数据如下:
[
{
"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) 我有一组数据需要进行处理才能生成报告
以下是提供的数据样本
$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) 我有具有不同角色的数据库表,我需要收集具有角色的项目owner将放在最后。这是数据库示例:
| ID | 角色 |
|---|---|
| 1 | 行政 |
| 2 | 用户 |
| 3 | 用户 |
| 4 | 所有者 |
| 5 | 用户 |
如何使用这些数据对集合进行排序以获取具有owner最后角色的项目?我只能想到按字母顺序对其进行排序,保存到某个变量并从集合中删除具有所有者角色的记录,然后将其作为最后粘贴到集合中。但这对我来说似乎不必要地复杂,难道没有更简单的方法吗?
我需要这个的原因是因为我需要删除所有选定的用户并确保用户/所有者是最后一个。
我已经进入了 Laravel 的奇妙世界,目前正在研究在数据库中植入虚假数据进行测试。
我有几个想要使用的表;项目和故事。
故事表有列;id、name和project_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) 它应该很简单,但我遗漏了一些东西,让我们说这个简单的口才:
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 方法可以在不遍历数组并创建一个新数组的情况下获得此结果
我试图从我的产品表中获取独特品牌的数量,以及来自 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,我正在寻找其他解决方案。
这是在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
我有一个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 ×10
eloquent ×3
laravel-5 ×3
php ×3
arrays ×1
faker ×1
laravel-5.2 ×1
laravel-5.3 ×1
laravel-5.4 ×1
laravel-5.5 ×1
laravel-5.6 ×1
phpunit ×1
sorting ×1