Laravel использует синхронизацию «многие ко многим», которая включает несколько дополнительных полей - PullRequest
1 голос
/ 31 октября 2019

Я пытаюсь использовать синхронизацию «многие ко многим», которая включает статус и комментарий. Я могу синхронизировать приложения без статуса и комментировать просто отлично.

NewUserAccount Модель

public function applications()
{
   return $this->belongsToMany('App\Application', 'new_user_account_applications', 'new_user_id')->withPivot('application_comment', 'status');
}

Application Модель

public function newUserAccounts()
{
  return $this->belongsToMany('App\NewUserAccount', 'new_user_accounts_applications', 'new_user_id')->withPivot('application_comment', 'status');
}

Мой NewUserAccountController

public function store(StoreRequest $request)
    {
       $userAccount = NewUserAccount::create(array_merge(
            $request->all(),
            ['submitted_by' => $requester->id],
            ['start_date' => Carbon::parse($request->input('start_date'))],
            ['account_expires' => $request->accountExpires('newAccountExpireDate')],
            ['company_id' => $requester->company_id],
            ['username' => $request->manuallyAssignId()]
        ));

       // Here I sync applications and include application comment and status 
       $userAccount->applications()->sync($request->applications, ['application_comment' => $request->application_comment, 'status' => 0]);

       ....

    }

Моя сводная диаграмма показывает статус и правильно комментирует
enter image description here

Моя форма. Вот где я не уверен, как обработать комментарий и заставить его сохранять с каждой сводной записью приложения.

@foreach($applications as $application)
    <label class="k-checkbox">
        <input value="{{ $application->id }}" name="applications[]" type="checkbox">{{ $application->application_name }} <span></span> 
    </label>

    <div class="form-group col-lg-4 mb-3">
        <label>Comments</label>
            <textarea name="application_comment[]" class="form-control" rows="2"></textarea>
    </div>
@endforeach

1 Ответ

3 голосов
/ 31 октября 2019

Во-первых, вам нужно установить правильный индекс для атрибута application_comment в текстовой области. Необходимо правильно определить комментарий для каждого приложения.

@foreach($applications as $application)
    ...
    <textarea name="application_comment[{{ $application->id }}]" class="form-control" rows="2"></textarea>
    ...
@endforeach

Затем вам просто нужно отформатировать данные в:

$userAccount->applications()->sync([
    application_id_1 => ['application_comment' => 'comment for application_id 1'],
    application_id_2 => ['application_comment' => 'comment for application_id 2'],
    ...
]);

Итак, вот оно:

$applications = collect($request->applications)->mapWithKeys(function ($appId) use ($request) {
    return [$appId => [
        'application_comment' => $request->input('application_comment')[$appId],
        'status' => 0,
    ]];
});

$userAccount->applications()->sync($applications);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...