Как я могу увлажнить модель Laravel с ее дочерними элементами, когда создаю их обоих?

В проекте 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, чтобы избежать выбора вставленных моделей?

Когда вы звоните $model->children()->create(), вам не нужен 'parent_id' => $model->id; это подразумевается через $model->children(). Затем вы можете просто вызвать $model->load('children') (или $model->load(['children' => function ($query) use ($childValues) { return $query->whereIn('value', $childValues); }]);, чтобы загрузить только те, которые вы создали). Кажется, вы пытаетесь избежать одного дополнительного запроса для загрузки этих записей из БД, что на самом деле не является узким местом в производительности... ->create() возвращает экземпляр, но не назначает его автоматически $model->children; вам нужно это сделать.

Tim Lewis 08.04.2024 19:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
109
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать такие методы, как 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);

Но не будет ли $model->children()->create(['value' => $value]) автоматически создаваться дочерний элемент модели??? Почему setRelation тоже требуется?

Dimitrios Desyllas 08.04.2024 18:48

@DimitriosDesyllas нет, create выполняет запрос на вставку в вашу БД и возвращает созданную модель. Теперь ваша модель загружена в память и вы можете решить, что с ней делать. Имейте в виду, что у $model может быть больше дочерних элементов, чем те, которые вы создали в этом методе, и таким образом вы присоединяете только те, которые вы создали во время этого конкретного вызова метода.

kris gjika 09.04.2024 09:32

Другие вопросы по теме