Laravel красноречивая вставка данных со связями - PullRequest
1 голос
/ 09 января 2020

У меня две модели: кроссовки и тренерыКлубы. И у меня есть json массив. Каждый массив json имеет свой другой массив. Когда ко мне приходит json, я хочу добавить их в модели отношений одновременно. например; Trainer :: insert ($ request-> all ());

мой json пример;

[
    {
        "identity_no": "111222333",
        "first_name": "john",
        "last_name": "doe",
        "TrainerClubs": [
            {
                "club_id": 1,
                "work_type": 1
            },
            {
                "club_id": 2,
                "work_type": 1
            }
        ]
    },
    {
        "identity_no": "444555666",
        "first_name": "jane",
        "last_name": "doe",
        "TrainerClubs": [
            {
                "club_id": 1,
                "work_type": 3
            },
            {
                "club_id": 13,
                "work_type": 3
            }
        ]
    }
]

и мои модели;

class Trainer extends Model
{
    public $timestamps = true;

    protected $guarded = ['id'];

    public function TrainerClubs()
    {
        return $this->hasMany('App\Modules\Trainer\Models\TrainerClub', 'trainer_id');
    }
}
class TrainerClub extends Model
{
    protected $guarded = ['id','created_at','updated_at'];

    public function Trainer()
    {
        return $this->belongsTo('App\Modules\Trainer\Models\Trainer');
    }
}

мой текущий рабочий код;

    public function create(array $data)
    {
        foreach ($data as $trainer) {
            $crrTrainer = (array)$trainer;
            $clubs = array_pop($crrTrainer);
            $addedTrainer = Trainer::create($crrTrainer);
            foreach ($clubs as $trainerClub) {
                $addedTrainer->TrainerClubs()->create($trainerClub);
            }
        }
        return true;
    }

Спасибо за помощь

1 Ответ

1 голос
/ 09 января 2020

Короткий ответ: вы не можете сохранить обе модели одновременно. В вашем случае вы должны сначала создать Тренера:

 $addedTrainer = Trainer::create($crrTrainer);

Позже вставьте булавы. То, что вы можете сделать по-другому, - это создать все клубы одновременно, не пропуская через них oop, используя createMany:

$addedTrainer->TrainerClubs()->createMany($clubs);
...