【问题标题】:Laravel eloquent insert data with relationshipLaravel eloquent 插入数据与关系
【发布时间】:2020-01-09 20:01:59
【问题描述】:

我有两个模型:trainers 和 trainerClubs。我有 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;
    }

感谢您的帮助

【问题讨论】:

  • 这些总是新行吗?
  • 是的,json会由excel创建
  • 我会坚持 Laravel 的命名约定。如果一个教练可以属于多个俱乐部,那么您可能只有一个 clubs 关系,它是一个属于多个 Club 的关系,而 work_typeclub_trainer 数据透视表中的一列。

标签: php laravel rest eloquent eloquent-relationship


【解决方案1】:

简短的回答是,您不能同时保存两个模型。在您的情况下,您必须首先创建培训师:

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

稍后插入球杆。您可以做的不同是同时创建所有俱乐部,而无需使用createMany 循环遍历它们:

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

【讨论】:

    猜你喜欢
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 2016-11-21
    • 2022-01-25
    • 1970-01-01
    • 2022-08-19
    • 2014-02-01
    相关资源
    最近更新 更多