创建具有一对多关系的实体Laravel

时间:2018-01-02 19:36:14

标签: php json laravel laravel-5

我有一个Product类和一个Image类。每个产品都有很多图片。我相信我已正确设置了关系,但在创建产品时,我无法创建图像。我有一个函数接受一个请求,该请求包含一个包含Product详细信息的JSON对象,包括一个Images数组。我将JSON转换为变量,但如果我只是将变量保存到数据库中,它只会保存产品详细信息,不包括图像。我使用以下内容查看了trid,但$ product变量未被识别为产品类型,因此,不识别Product类上的images()。

$product->images()->save($images)

这是用于创建产品的功能:

public function api_create(Request $request)
{
    try {
        $product = new Product;
        $product = json_decode($request->getContent(), true);
        $images = $product['images'];
        return Product::create($product);
    } catch (Exception $exception) {
        return "error";
    }
}

在产品类中:

public function images(){
    return $this->hasMany('App\Image', 'productId');
}    

在Image类中:

public function product(){
    return $this->belongsTo('App\Product', 'productId');
}

图像db列:id(PK),productId(FK),imageUrl

产品数据库列:id(PK),标题,描述

1 个答案:

答案 0 :(得分:3)

改变这个:

$images = $product['images'];
return Product::create($product);

要:

$product = Product::create($product);
foreach ($product['images'] as $image) {
    $product()->images()->create($image);
}
return $product;

如果每个$image是一个格式正确的数组,这将起作用,如:

['filename' => 'flower.jpg', 'size' => 54438]

如果格式不同,您需要手动映射,例如:

->create([
    'filename' => $image['uploaded_file_name'],
    'size' => $image['file_size_in_bytes']
]);