Создание элемента с несколькими отношениями за 1 вызов

Итак, у меня есть таблица проекта:

Schema::create('projects', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('user_id');
    $table->string('name');
    $table->string('reference')->nullable();
    $table->date('started')->nullable();
    $table->date('ended')->nullable();
    $table->string('industry')->nullable();
    $table->string('operatives')->nullable();
    $table->timestamps();
    $table->softDeletes();
});

И у меня есть таблица часов:

Schema::create('hours', function (Blueprint $table) {
    $table->increments('id');
    $table->string('hours');
    $table->date('date')->nullable();
    $table->text('notes')->nullable();
    $table->integer('project_id');
    $table->integer('user_id');
    $table->softDeletes();
    $table->timestamps();
});

Теперь можно ли как-то создать ассоциацию как с project_id, так и с user_id за один вызов?

Я знаю, что могу сделать следующее (добавив user_id к часам):

$hours = [
    'hours'      => $request->hours,
    'date'       => $request->date,
    'operatives' => $request->operatives,
    'notes'      => $request->notes,
    'user_id'    => auth()->user()->id,
];

$create = $project->hours()->save(new $this->hour($hours));

Но я пытаюсь сделать что-то вроде этого:

$hours = [
    'hours'      => $request->hours,
    'date'       => $request->date,
    'operatives' => $request->operatives,
    'notes'      => $request->notes,
];

$create = $project->hours()->save(auth()->user()->save($hours));

И user, и project имеют одинаковое отношение часов в своих классах:

/**
 * @return \Illuminate\Database\Eloquent\Relations\HasMany
 */
public function hours(): HasMany
{
    return $this->hasMany(Hour::class);
}

Возможно ли это, если да, то как мне это сделать?


person Community    schedule 02.10.2018    source источник
comment
есть ли другие поля в таблице часов?   -  person zjbarg    schedule 02.10.2018
comment
@barghouthi обновлен с полной структурой таблицы   -  person    schedule 02.10.2018
comment
Я вижу, что вы пытаетесь сделать это красиво. Я не могу найти способ. На вашем месте я бы использовал Hour::create([..... 'project_id' => $project->id, 'user_id' => $user->id]. по крайней мере, это соответствует   -  person zjbarg    schedule 02.10.2018


Ответы (1)


Я думаю, что лучший способ справиться с этим — разделить сохранение Hours как независимого экземпляра модели, а затем синхронизировать его с обоими следующим образом:

$hour = Hour::create($hours);
$project->hours()->syncWithoutDetaching([$hour->id]);
$user->hours()->syncWithoutDetaching([$hour->id]);
person Jaime Rojas    schedule 02.10.2018
comment
Невозможно, так как для часов требуются как project_id, так и user_id. - person ; 02.10.2018
comment
Ты прав. Если это так, то, что вы сейчас делаете (передавая user_id в параметрах), - это путь. Что-то вроде этого $create = $project->hours()->save(auth()->user()->save($hours)); не будет работать, потому что метод save->() возвращает true / false в зависимости от того, удалось ли сохранить или нет. Это не позволит вам работать так, как вы этого хотите. - person Jaime Rojas; 02.10.2018