【问题标题】:How to merge child key pairs to parents in Laravel models如何在 Laravel 模型中将子密钥对合并到父密钥对
【发布时间】:2021-08-09 19:15:26
【问题描述】:

这里是老 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);

谢谢!

【问题讨论】:

  • 在 eloquent 查询中使用 join 来执行此操作。这两张表之间有什么关系吗?
  • 是的,有。数据的表有一个指向 NewData 的 ID 的 new_data_id。 public function new_data() { return $this->belongsTo(NewData::class);我之前使用过 join,但我在某处读到“急切加载”要快得多
  • 如果我们谈论的是多个连接,查询构建器与 eloquent 相比相当快。你可以像youtube.com/watch?v=3TJfR1Ta4GU&t=138s一样测试性能。

标签: laravel eloquent key laravel-models


【解决方案1】:

你可以使用flatten方法。

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

flatten docu

【讨论】:

  • 我不认为 flatten 直接与 eloquent 模型一起工作,而是尝试 collect($data)->flatten();给了我一个没有键的值数组。数据 = [1,2,3]
【解决方案2】:

您可以使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-14
    • 2012-01-12
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    相关资源
    最近更新 更多