laravel collection 嵌套查询
laravel collection nested query
我是 laravel collection 的新手。我只想用 collection
进行查询
DB::select(SELECT id, user_id, created_at,latitude,longitude
FROM coordinates
WHERE created_at IN (
SELECT MAX(created_at)
FROM coordinates
GROUP BY user_id));
根据文档https://laravel.com/docs/6.x/collections
这是我所做的,它给了我所有的数据
$this->data['information'] = collect($response->json()['items']);
编辑:
只是我需要使用 Collection.
生成该查询(我上面提到的)
这是$response->json()['items']
的内容
"#items: array:17 [▼ 0 => array:9 [▼ "id" => 977777779 "platform_id" => "msaeed" "platform_type" => 1 "status" => 1 "longitude" => 1.1 "latitude" => 1.1 "created_by" => "NMF" "created_at" => "2019-10-27T21:00:00Z" "updated_at" => "2019-10-28T07:58:36Z""
任何帮助将不胜感激
您想递归收集数组
很遗憾 laravel 没有此功能:
你可以自己写。
如果你有帮助文件,你可以写这个方法:
function recursive_collect($array){
foreach ($array as $key => $value) {
if (is_array($value)) {
$value = recursive_collect($value);
$array[$key] = $value;
}
}
return collect($array);
}
或者您可以在 AppServiceProvider
:
中实现宏
\Illuminate\Support\Collection::macro('recursive', function () {
return $this->map(function ($value) {
if (is_array($value) || is_object($value)) {
return collect($value)->recursive();
}
return $value;
});
});
希望对您有所帮助
这里是查询。
$data = collect($response->json()['items']);
$data = $data->whereIn('created_at', $data->sortByDesc('created_at')
->groupBy('user_id')
->pluck('0.created_at'))
->onlyKeys(['id', 'user_id', 'created_at', 'latitude', 'longitude']);
子查询的等价物:
SELECT MAX(created_at)
FROM coordinates
GROUP BY user_id
是
$data->sortByDesc('created_at') // we use sortByDesc to produce the same result as `MAX`.
->groupBy('user_id')
->pluck('0.created_at') // then to get the max value, just get the first array after grouping.
为了实现select
语句,我们需要创建一个小宏,我将其命名为onlyKeys
:
use Illuminate\Support\Arr;
Collection::macro('onlyKeys', function ($keys) {
return $this->map(function ($value) use ($keys) {
$tmpValue = (array) $value;
if (is_array($tmpValue)) {
$value = Arr::only($tmpValue, $keys);
}
return $value;
});
});
您可以在 AppServiceProvider.php.
中注册宏
PS. 为什么要用集合查询?那个数据不是来自DB吗?
我是 laravel collection 的新手。我只想用 collection
进行查询DB::select(SELECT id, user_id, created_at,latitude,longitude
FROM coordinates
WHERE created_at IN (
SELECT MAX(created_at)
FROM coordinates
GROUP BY user_id));
根据文档https://laravel.com/docs/6.x/collections
这是我所做的,它给了我所有的数据
$this->data['information'] = collect($response->json()['items']);
编辑:
只是我需要使用 Collection.
生成该查询(我上面提到的)这是$response->json()['items']
的内容"#items: array:17 [▼ 0 => array:9 [▼ "id" => 977777779 "platform_id" => "msaeed" "platform_type" => 1 "status" => 1 "longitude" => 1.1 "latitude" => 1.1 "created_by" => "NMF" "created_at" => "2019-10-27T21:00:00Z" "updated_at" => "2019-10-28T07:58:36Z""
任何帮助将不胜感激
您想递归收集数组 很遗憾 laravel 没有此功能:
你可以自己写。 如果你有帮助文件,你可以写这个方法:
function recursive_collect($array){
foreach ($array as $key => $value) {
if (is_array($value)) {
$value = recursive_collect($value);
$array[$key] = $value;
}
}
return collect($array);
}
或者您可以在 AppServiceProvider
:
\Illuminate\Support\Collection::macro('recursive', function () {
return $this->map(function ($value) {
if (is_array($value) || is_object($value)) {
return collect($value)->recursive();
}
return $value;
});
});
希望对您有所帮助
这里是查询。
$data = collect($response->json()['items']);
$data = $data->whereIn('created_at', $data->sortByDesc('created_at')
->groupBy('user_id')
->pluck('0.created_at'))
->onlyKeys(['id', 'user_id', 'created_at', 'latitude', 'longitude']);
子查询的等价物:
SELECT MAX(created_at)
FROM coordinates
GROUP BY user_id
是
$data->sortByDesc('created_at') // we use sortByDesc to produce the same result as `MAX`.
->groupBy('user_id')
->pluck('0.created_at') // then to get the max value, just get the first array after grouping.
为了实现select
语句,我们需要创建一个小宏,我将其命名为onlyKeys
:
use Illuminate\Support\Arr;
Collection::macro('onlyKeys', function ($keys) {
return $this->map(function ($value) use ($keys) {
$tmpValue = (array) $value;
if (is_array($tmpValue)) {
$value = Arr::only($tmpValue, $keys);
}
return $value;
});
});
您可以在 AppServiceProvider.php.
中注册宏PS. 为什么要用集合查询?那个数据不是来自DB吗?