当我创建 Laravel 模型和子模型时,如何将它们水合?

问题描述 投票:0回答:1

在 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]);
}

$reource = new MyModelResource($model);

我有一个资源可以序列化我的模型:

namespace App\Http\Resources;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

class MyModelResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @return array<string, mixed>
     */
    public function toArray(Request $request): array
    {

        return [
            'id' => $this->id,
            'value'=>$this->value,
            'children' => ModelChildResource::collection($this->children)
        ];
    }
}

还有一个给孩子的:

namespace App\Http\Resources;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

class ModelChildResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @return array<string, mixed>
     */
    public function toArray(Request $request): array
    {

        return [
            'id' => $this->id,
            'value'=>$this->value,
        ];
    }
}

如您所见,我一次性创建了一个带有子元素的模型,然后创建了一个资源。

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,'child_id','id');
    }
}

同样是

ModelChild
一:

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;


class MyModel extends Model
{
    use HasFactory;

    protected function mymodel()
    {
        return $this->belongsTo(Model::class,'id','child_id');
    }
}

我的问题是如何使用

$model
来水合
$modelChildValues
中的模型,这样我就可以避免选择插入的模型?

php laravel eloquent hydration
1个回答
0
投票

您可以使用

setRelation
等方法手动附加一个或多个模型

$childValues = [1,3,4,5];
$model = MyModel::create(['value'=>1.2]);

$children = collect([]);
foreach($childValues as $value) {
  // the relation field will be auto filled
  $children->push($model->children()->create(['value' => $value]));
}

$model->setRelation('children', $children);

$reource = new MyModelResource($model);
© www.soinside.com 2019 - 2024. All rights reserved.