1

这里是老 PHP 用户,但对 Laravel 不熟悉,我需要帮助(答案或相关解决方案的链接)...

如果我有一个关系模型(或集合,我会在这里感到困惑)......

$data = MyData::with('new_data')->first();

结果...

data = {
   a: 1,
   b: 2,
   new_data: {
     c: 3
   } 
}

是否有一个简单的 eloquent 或收集功能将 new_data 键对合并到父数据?这样会导致这个......

data = {
   a: 1,
   b: 2,
   c: 3
}

我尝试过 flatten、flatMap、mapWithKeys 和其他示例,但未能得到我想要的结果。如果没有简单的解决方案,这将是我的长期方法......

$raw_data = MyData::with('new_data')->first();
$data = collect($raw_data)->put('c', $raw_data->new_data->c);

谢谢!

4

2 回答 2

0

您可以使用扁平化方法。

$data = MyData::with('new_data')->first()->flatten();

展平文档

于 2021-05-20T14:26:39.727 回答
0

您可以使用 array_walk_recursive 的力量来获得该结果。让我们构建我们的自定义函数来展平这些模型。试试这个解决方案

$myData = MyData::with('new_data')->first();

function flattenMyModel($model) {
   $modelArr = $model->toArray();
   $data = [];
   array_walk_recursive($modelArr, function ($item, $key) use(&$data) {
       $data[$key] = $item;
   });
   return $data;
}

$myDataArr = flattenMyModel($myData);

dd($myDataArr);

您可以使用查询构建器或使用 Model::join(); 这就是我将如何做到的。

$datas = DB::table('my_data as md')
             ->join('new_data as nd','md.id','nd.my_data_id')
             ->selectRaw('md.a,md.b,nd.c')
             ->first(); 

您可以在此处查看有关预加载的更多信息并加入laravel-eager-loading-vs-explicit-join

于 2021-05-20T17:24:52.120 回答