Laravel множество взаимосвязей и прикрепление без сводной таблицы из массива полей ввода

#php #laravel #eloquent #many-to-many

#php #laravel #красноречивый #многие ко многим

Вопрос:

У меня есть пользователи и операторы, и у каждого пользователя может быть только один оператор, но у оператора может быть много пользователей

Итак, в операторной модели у меня есть:

 public function profile() {
  return $this->hasMany(User::class);
}
  

И в пользовательской модели у меня есть:

 public function operator() {
  return $this->hasOne(Operator::class);
}
  

Итак, я думаю, что я правильно понял отношения?

Теперь, если у меня есть поле ввода для управления операторами, и в нем у меня есть поле множественного выбора, чтобы я мог выбрать многих пользователей для добавления к этому оператору, поле ввода будет примерно таким:

 <select name="profiles[]" id="profiles" multiple="multiple" class="multiselect2 form-control">
  @foreach($profiles as $key => $profile)
  <option value="{{ $profile->id }}">{{ $profile->name }} {{ $profile->lastname }}</option>
  @endforeach
</select>
  

В форме отправки, которая разместила бы массив всех выбранных $ profiles (это пользователи из таблицы user)

Что для меня немного сложно, так это когда я создаю нового оператора и выбираю, каких пользователей присоединять к operator, я не знаю, как я мог бы добавить их и синхронизировать без сводной таблицы, и мне вообще не нужна сводная таблица для этого.

у меня есть operators таблица, и в ней должны содержаться идентификаторы оператора и управляемых пользователей

  ---- ------------- --------- 
| id | operator_id | user_id |
 ---- ------------- --------- 
|  1 |           3 |      23 |
|  2 |           3 |      28 |
|  2 |           3 |      36 |
 ---- ------------- --------- 
  

Итак, как я могу добавить (прикрепить или подключить) идентификаторы пользователей операторов и управляемых пользователей в таблицу operators?

Вот мой текущий код контроллера

   $user = new User;

  $user->name = $request->name;
  $user->email = $request->email;
  $user->password = bcrypt($request->password);

  $user->save();

  $user->operator()->attach(['operator_id' => $user->id,  'profile_id' => $request->profiles]);
  

Ответ №1:

Просто используйте eloquent для выполнения объединения.

 DB::select("SELECT * FROM Users u
INNER JOIN operators o dp ON u.id = o.user_id;");
  

Просто убедитесь, что вы выполняете объединения для каждой таблицы, к которой вам нужно подключиться