У меня есть дополнительный столбец для имен пользователей в моей сводной таблице role_user, как я могу синхронизировать имя пользователя с ролями?
role_user сводная таблица
Мне нужно синхронизировать имя пользователя в поле name
Это функция обновления, в которую я добавил sync
public function update(Request $request, User $user)
{
$role = $request->role;
$userName = Auth::user();
$user->roles()->sync([$role=>['name'=>$userName->name]]);
dd('stop');
}
Вот отношения в моем User Model
public function roles()
{
return $this->belongsToMany(Role::class)->withPivot(['name'])->withTimestamps();
}
Вот перенос таблицы role_user
class CreateRoleUserTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('role_user', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('role_id');
$table->unsignedBigInteger('user_id');
$table->string('name')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('role_user');
}
}
Я получил эту ошибку, если, когда я пытался
Это то, что я получаю, когда я выгружаю запрос и имя пользователя Auth
Дамп коды
$userName = Auth::user();
dump('Auth user name = '.$userName->name);
dump($request->all());
dd('stop');
Вы можете распечатать то, что вы отправляете в запросе? мы уверены, что вы вошли в систему, а auth()->user() не возвращает null? и убедитесь, что $request->role соответствует id роли, иначе это не сработает.
У именования переменных @lagbox есть некоторые проблемы, поскольку $userName представляет объект User, $userName->name имеет смысл.
ну, мы не знаем, как настроена ваша аутентификация ... но аутентифицированный пользователь не совпадает с пользователем, для которого вы потенциально синхронизируете роль, зачем вам имя текущего аутентифицированного пользователя для чьего-либо идентификатора пользователя?
@lagbox Я обновил вопрос, мне нужно добавить имя пользователя Auth в сводную таблицу.
$role — это массив, а не отдельное значение (массивы не могут быть ключами массива), вам придется настроить способ построения массива, переданного в sync@lagbox Итак, есть ли способ передать имя пользователя Auth с массивом в сводную таблицу, пожалуйста, предложите мне способ
вам нужно будет сделать правильный массив для перехода к sync
@lagbox Мне нужно знать, как сделать правильный массив?
документы показывают, как будет выглядеть массив, попробуйте следовать тому, что он говорит, если нет, мы можем что-то понять
@lagbox, когда я использовал attach, он работает нормально, но мне нужно использовать sync, так как присоединение будет создавать дубликаты






Вам нужен ассоциативный массив с идентификатором роли с массивом для каждого элемента, чтобы добавлять вещи в сводную таблицу. В настоящее время у вас есть просто массив идентификаторов ролей, что нормально для sync как есть, но не в том случае, если вы хотите также установить дополнительные опорные данные. Вам нужен массив, например:
[1 => ['name' => ...], 2 => ['name' => ...]]
Вы можете использовать array_fill_keys для создания этого массива с ключами, являющимися идентификаторами ролей, и значениями, являющимися массивом с полем «имя»:
$roles = (array) $request->input('role', []);
$forSync = array_fill_keys($roles, ['name' => $userName->name]);
Большое спасибо, вышеуказанные коды сработали, я отредактировал строки
Хорошо, вы почти сделали это правильно. кроме..
Вам нужно написать это так (используя метод Collection mapWithKeys):
$roles = collect($request->role)->mapWithKeys(function($role){
return [$role => ['name' => Auth::user()->name];
})->toArray();
$user->roles()->sync($roles);
причина этого в том, что вам нужно указать параметры сводной таблицы для каждой роли отдельно. поэтому вместо [[1,2] => ['name' => 'John']] вам нужно иметь [1 => ['name' => 'John'],2 => ['name' => 'John']], чтобы это работало.
Эти коды тоже работают, большое спасибо
разве вы не хотите
$user->nameвместо$userName->name... поскольку$user— это пользователь для того идентификатора, который вы добавляете в сводную таблицу?