Laravel将关系对象添加到新的雄辩模型中

时间:2017-08-08 06:05:20

标签: php laravel eloquent laravel-eloquent

我想使用一个表单部分表示新的和现有的对象。

我发现了类似的问题:

但是我不能并且不想保存父对象。

我来自带有活动记录的rails视图。我可以做到以下几点:

我们说我有一个包含许多产品的类别:

category = Category.new
category.products << Product.new

现在我可以遍历像

这样的产品
category.products.each do ...

现在我希望在laravel中使用雄辩的模型

$category = new Category();
$category->products()->....
构建器不存在

addsave需要存储的类别 attach需要相同的

有没有办法让我的想法奏效? 我的目标是使用相同的形式部分编辑和创建具有已定义关系的模型。

2 个答案:

答案 0 :(得分:1)

您可以使用$category->products()->createMany([]) Create Many

创建多个作品

在您拥有Category Product之后,您可以使用

对其进行循环
for ($category->products as $product) {
   // do something
}

$category->products->each(function ($product) {
    // do something
});

请注意,产品之后缺少()这将返回Collection

答案 1 :(得分:0)

Ken的回答,不符合我的特殊情况。所以我必须创建一个服务对象来处理所有依赖的情况。此服务对象存储父(我的类别)并为每个父项存储子项(我的每个类别的产品)。当所有数据都有效时,它将持久存储到数据库中。如果没有,那么save()返回false,我得到异常消息和验证错误。

所以我的服务对象包含以下内容:

namespace App\Services;


use Illuminate\Support\Facades\Validator;

class FormObject
{
    protected $children = [];
    protected $parent, $validator;
    protected $errorMessages = [];


    public function save(){
        if(!$this->isValid()){
            return false;
        }
        try{
            DB::beginTransaction();

            // save parent and all relations....

            DB::commit();

        }catch(\Exception $e){
            DB::rollBack();
            $this->addErrorMessage($e->getMessage());
            return false;
        }

        return true;

    }

    public function isValid(){
        return $this->getValidator()->passes();
    }

    public function add($identifier, array $collection){
        $this->children[$identifier] = $collection;
    }

    public function addErrorMessage($message){
        array_push($this->errorMessages, $message);
    }

    public function setParent(Model $parent){
        $this->parent = $parent;
    }

    public function setValidator(Validator $validator){
        $this->validator = $validator;
    }

    public function get($identifier){
        return $this->children[$identifier];
    }

    public function getErrorMessages(){
        return $this->errorMessages;
    }

    public function getParent(){
        return $this->parent;
    }

    public function getValidator(){
        return $this->validator;
    }



}