Имя пользователя Laravel Sync в сводную таблицу

У меня есть дополнительный столбец для имен пользователей в моей сводной таблице 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');

разве вы не хотите $user->name вместо $userName->name ... поскольку $user — это пользователь для того идентификатора, который вы добавляете в сводную таблицу?

lagbox 19.12.2020 08:08

Вы можете распечатать то, что вы отправляете в запросе? мы уверены, что вы вошли в систему, а auth()->user() не возвращает null? и убедитесь, что $request->role соответствует id роли, иначе это не сработает.

Mojtaba Hn 19.12.2020 08:09

У именования переменных @lagbox есть некоторые проблемы, поскольку $userName представляет объект User, $userName->name имеет смысл.

Mojtaba Hn 19.12.2020 08:10

ну, мы не знаем, как настроена ваша аутентификация ... но аутентифицированный пользователь не совпадает с пользователем, для которого вы потенциально синхронизируете роль, зачем вам имя текущего аутентифицированного пользователя для чьего-либо идентификатора пользователя?

lagbox 19.12.2020 08:11

@lagbox Я обновил вопрос, мне нужно добавить имя пользователя Auth в сводную таблицу.

Jareer 19.12.2020 08:16
$role — это массив, а не отдельное значение (массивы не могут быть ключами массива), вам придется настроить способ построения массива, переданного в sync
lagbox 19.12.2020 08:17

@lagbox Итак, есть ли способ передать имя пользователя Auth с массивом в сводную таблицу, пожалуйста, предложите мне способ

Jareer 19.12.2020 08:18

вам нужно будет сделать правильный массив для перехода к sync

lagbox 19.12.2020 08:19

@lagbox Мне нужно знать, как сделать правильный массив?

Jareer 19.12.2020 08:20

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

lagbox 19.12.2020 08:20

@lagbox, когда я использовал attach, он работает нормально, но мне нужно использовать sync, так как присоединение будет создавать дубликаты

Jareer 19.12.2020 08:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
11
1 033
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вам нужен ассоциативный массив с идентификатором роли с массивом для каждого элемента, чтобы добавлять вещи в сводную таблицу. В настоящее время у вас есть просто массив идентификаторов ролей, что нормально для sync как есть, но не в том случае, если вы хотите также установить дополнительные опорные данные. Вам нужен массив, например:

[1 => ['name' => ...], 2 => ['name' => ...]]

Вы можете использовать array_fill_keys для создания этого массива с ключами, являющимися идентификаторами ролей, и значениями, являющимися массивом с полем «имя»:

$roles = (array) $request->input('role', []);

$forSync = array_fill_keys($roles, ['name' => $userName->name]);

Большое спасибо, вышеуказанные коды сработали, я отредактировал строки

Jareer 19.12.2020 08:46

Хорошо, вы почти сделали это правильно. кроме..

Вам нужно написать это так (используя метод 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']], чтобы это работало.

Эти коды тоже работают, большое спасибо

Jareer 19.12.2020 08:47

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