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

L. *_*llo 5 php laravel eloquent laravel-5

我有两个 Model 类,它们具有像这样的 oneToMany 关系

应用\汽车
class Car extends Model
{

    public $timestamps = true;

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

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

}
Run Code Online (Sandbox Code Playgroud) 应用\部分
class Part extends Model
{

    public $timestamps = false;

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

{
    "name": "Fiat Punto",
    "price": 15000,
    "parts": [
        {
            "name": "wheel",
            "price": 300
        },
        {
            "name": "engine",
            "price": 5000
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

有没有办法保存 Car 模型并一键创建关系?

我试图在我的控制器中这样做,但它不起作用:

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

PS:我已经知道如何使用foreachor完成任务array_reduce,只是想知道 laravel 是否可以为我完成


- 编辑 -

这是我现在实现控制器的方式:

...
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);
}
...
Run Code Online (Sandbox Code Playgroud)

欢迎任何改进

Dav*_*röm 3

我不\xc2\xb4t 认为有一种方法可以解决您需要创建请求对象中定义的每个 App\\Part 模型实例这一事实。因此,在某些时候您必须迭代请求对象中的这些项目,这意味着您(至少)有两个选择。这些都在这里描述

\n\n

顺便说一句,我认为在这种情况下,最好使用 foreach 循环作为第一个选项:

\n\n
foreach ($request->input(\'parts\') as $item) {\n    $car->parts()->save(new Part($item));\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
$parts = array_map(function($part) {\n     return new App\\Part($part);\n}, $request->input(\'parts\'));\n\n$car->parts()-saveMany($parts);\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
$parts = array_map(function($part) {\n  return [...$part, \'car_id\' => $car->id];\n}, $input[\'parts\'])\n\nDB::table(\'parts\')->insert($parts);\n
Run Code Online (Sandbox Code Playgroud)\n

  • 这两个选项都会生成多个查询。如果您想避免多次查询,则需要使用查询生成器。 (2认同)