Laravel добавляет объекты отношений в новую красноречивую модель

Я хочу использовать частичную форму для нового и существующего объекта.

Я нашел похожие вопросы:

но я не могу и не хочу сохранять родительский объект.

Я пришел из просмотра рельсов с активной записью. Я могу сделать следующее:

Допустим, у меня есть категория, в которую входит много товаров:

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

Теперь я могу перебирать такие продукты, как

category.products.each do ...

Теперь я хочу то же самое в laravel с красноречивой моделью

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

add не существует для Builder. save нужна сохраненная категория attach нужна такая же

есть ли способ заставить мою идею работать? Моя цель — использовать один и тот же фрагмент формы для редактирования и создания модели с определенными отношениями.


person rob    schedule 08.08.2017    source источник
comment
Итак, вы хотите сохранить несколько продуктов с одинаковым идентификатором категории?   -  person madalinivascu    schedule 08.08.2017
comment
@madalinivascu да. но идентификатор категории в настоящее время не существует в базе данных. это новая категория, которая включает в себя некоторые новые продукты   -  person rob    schedule 08.08.2017
comment
поэтому сначала создайте категорию, затем создайте новые продукты   -  person madalinivascu    schedule 08.08.2017
comment
@madalinivascu я не могу. возможно, что категория недействительна. а также может быть в коллекции есть продукт, который недействителен   -  person rob    schedule 08.08.2017
comment
затем сохраните продукты во временной категории, затем создайте действительную категорию, после чего вы обновите/удалите продукты   -  person madalinivascu    schedule 08.08.2017
comment
когда вы проверяете, действительна ли категория, как?   -  person madalinivascu    schedule 08.08.2017


Ответы (2)



Ответ Кена не подходит для моей особой ситуации. Поэтому мне нужно создать объект службы, который позаботится обо всех зависимых случаях. Этот сервисный объект хранит родительский элемент (моя категория) и хранит дочерние элементы (мои продукты для каждой категории) для каждого родителя. Когда все данные действительны, они будут сохранены в базе данных. Если нет, то 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;
    }



}
person rob    schedule 08.08.2017