如何在创建Laravel模型及其子模型时关联填充模型数据
问题解决:将已创建的子模型关联到父模型以避免重复查询
首先先修正你代码里的模型关联错误,这是前提:
ModelChild模型类名写错了,应该是ModelChild而非MyModelMyModel的hasMany关联外键不匹配:你创建子模型时用的是parent_id,但原关联里写的是child_idModelChild的belongsTo关联目标模型和外键错误,要关联MyModel且外键为parent_id
修正后的模型代码
MyModel 关联修正
namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class MyModel extends Model { use HasFactory; protected function children() { return $this->hasMany(ModelChild::class, 'parent_id', 'id'); } }
ModelChild 模型修正
namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class ModelChild extends Model { use HasFactory; protected function mymodel() { return $this->belongsTo(MyModel::class, 'parent_id', 'id'); } }
核心解决方案:绑定已创建的子模型到父模型
有三种方式可以实现,都能避免再次查询数据库:
方式1:用setRelation手动绑定(最规范)
Laravel提供了专门的方法来手动设置关联数据,直接把已创建的子模型集合绑定到父模型的关联上:
$childValues = [1,3,4,5]; $model = MyModel::create(['value'=>1.2]); $modelChildValues = []; foreach($childValues as $value){ $modelChildValues[] = ModelChild::create(['parent_id'=>$model->id,'value'=>$value]); } // 将子模型集合绑定到父模型的children关联 $model->setRelation('children', collect($modelChildValues)); $resource = new MyModelResource($model);
方式2:直接赋值关联属性
关联数据加载后会存在模型的属性中,所以可以直接赋值:
// 前面的创建代码不变 $model->children = collect($modelChildValues); $resource = new MyModelResource($model);
方式3:通过父模型关联创建子模型(最简洁)
直接用父模型的关联方法创建子模型,Laravel会自动把新创建的子模型加载到父模型的关联中,无需手动处理:
$childValues = [1,3,4,5]; $model = MyModel::create(['value'=>1.2]); // 批量创建子模型并自动关联到父模型 $modelChildValues = $model->children()->createMany( collect($childValues)->map(fn($v) => ['value' => $v])->toArray() ); // 此时$model->children已经包含刚创建的子模型,直接生成资源即可 $resource = new MyModelResource($model);
内容的提问来源于stack exchange,提问作者Dimitrios Desyllas
相关产品推荐
相关产品推荐

