gpt4 book ai didi

php - 有没有办法在 laravel 5 中批量分配关系?

转载 作者:可可西里 更新时间:2023-11-01 00:30:29 24 4
gpt4 key购买 nike

我有两个具有这样的 oneToMany 关系的模型类

应用\汽车
class Car extends Model
{

public $timestamps = true;

protected $fillable = [
'name',
'price'
];

public function parts ()
{
return $this->hasMany('App\Part');
}

}
应用\零件
class Part extends Model
{

public $timestamps = false;

protected $fillable = [
'name',
'price'
];

public function car ()
{
return $this->belongsTo('App\Car');
}

}

客户端使用 JSON 发出 POST 请求,表示带有嵌套零件数组的汽车

{
"name": "Fiat Punto",
"price": 15000,
"parts": [
{
"name": "wheel",
"price": 300
},
{
"name": "engine",
"price": 5000
}
]
}

有没有办法保存汽车模型并一次性创建关系?

我试图在我的 Controller 中执行此操作,但它不起作用:

...
public function store (Request $request) {
$input = $request->all();
Car::create($input);
}
...

PS:我已经知道如何使用 foreacharray_reduce 完成任务,只是想知道 laravel 是否可以为我做这件事


-- 编辑--

这是我现在如何实现 Controller :

...
public function store (Request $request) {
$input = $request->all();
$car = Car::create($input);
$parts = array_reduce(
$input['parts'],
function ($carry, $item) {
array_push($carry, new Part($item));
return $carry;
},
[]
);
$car->parts()->saveMany($parts);
}
...

欢迎任何改进

最佳答案

我认为没有办法解决您需要创建在请求对象中定义的每个 App\Part 模型实例这一事实。因此,在某些时候您必须遍历请求对象中的这些项目,这意味着您有(至少)两个选项。这些都是 described here .

附带说明一下,我认为在这种情况下,最好对第一个选项使用 foreach 循环:

foreach ($request->input('parts') as $item) {
$car->parts()->save(new Part($item));
}

如果您选择第二种方法,即首先将它们存储在数组中,那么我认为 array_map 是更合适的方法(因为没有实际的“减少”进行):

$parts = array_map(function($part) {
return new App\Part($part);
}, $request->input('parts'));

$car->parts()-saveMany($parts);

编辑:根据@TomasKim 的建议,只有 2 个查询 - 一个用于汽车模型,另一个用于零件模型:

$parts = array_map(function($part) {
return [...$part, 'car_id' => $car->id];
}, $input['parts'])

DB::table('parts')->insert($parts);

关于php - 有没有办法在 laravel 5 中批量分配关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34795841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com