Laravel 将关系对象添加到新的 eloquent 模型

Laravel add relation objects to new eloquent model

我想为新对象和现有对象使用部分表单。

我发现了类似的问题:

但我不能也不想保存父对象。

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

假设我有一个包含许多产品的类别:

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

现在我可以像这样迭代产品

category.products.each do ...

现在我想在 laravel 中使用 eloquent 模型

$category = new Category();
$category->products()->....

add 对于生成器不存在。 save 需要存储类别 attach 需要相同的

有没有办法让我的想法付诸实施? 我的目标是使用相同的形式部分进行编辑和创建具有定义关系的模型。

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

创建许多作品

在你有一个包含许多 ProductCategory 之后,你可以使用

遍历它们
for ($category->products as $product) {
   // do something
}

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

注意缺少 () 后的产品,这将 return 一个 Collection

Ken 的回答,不适合我的特殊情况。所以我必须创建一个服务对象来处理所有依赖案例。此服务对象存储父项(我的类别)并为每个父项存储子项(我的每个类别的产品)。当所有数据都有效时,它将被持久化到数据库中。如果没有,那么 save() returns 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;
    }



}