Laravel обновление реляционной таблицы не работает - PullRequest
1 голос
/ 30 марта 2020

Вопрос 1: Невозможно обновить запись для реляционной таблицы profiles. В итоге получится следующая ошибка.

Ошибка

Подсветка \ База данных \ QueryException
SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец 'user_id' в 'списке полей' (SQL: обновление users set user_id = 132, users. updated_at = 2020-03-30 08:48:51 где id = 132 )

У меня есть две таблицы users и profiles со схемой ниже

Схема пользователя

Schema::create(
    'users',
    function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('username')->unique();
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password')->nullable();
        $table->enum('role', ['super', 'admin', 'manager', 'subscriber', 'user'])->default('user');
        $table->boolean('is_root')->default(FALSE);
        $table->rememberToken();
        $table->timestamps();

        $table->unique(['username', 'email'], 'users_unique_credentials');
    }
);

Схема профиля

Schema::create('profiles', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->bigInteger('user_id')->unsigned();
    $table->string('key', 191);
    $table->longText('value')->nullable();

    $table->foreign('user_id', 'profile_uid_fk')
          ->references('id')
          ->on('users')
          ->onDelete('cascade');

    $table->unique(['user_id', 'key'], 'profile_unique_key');
});

Пользовательский модал - отношение

public function profiles()
{
    return $this->hasMany(Profile::class)->orderBy('id');
}

Профиль модальный - отношение

public function user()
{
    return $this->belongsTo(User::class);
}

Пользовательский контроллер - обновление

public function update(UserRequest $request, User $user)
{

    $user->email = $request->email;
    $user->role  = $request->role;

    if ($request->has('password')) {
        $user->password = Hash::make($request->password);
    }

    $user->save();
    $user->profile()->save($user);

}

dd - $ request-> all ()

Вопрос 2: user_id - это скрытое поле в форме. Однако я бы предпочел вместо этого передать его с контроллера. Есть ли способ сделать это?

array:15 [▼
  "_token" => "O3Ardvzz7QvAsYa7aUWn4dbJx1qpCsScykD1fh1S"
  "_method" => "PUT"
  "email" => "newage@test.com"
  "password" => null
  "password_confirmation" => null
  "role" => "subscriber"
  "first_name" => "John"
  "last_name" => "doe"
  "city" => "Ahmedabad"
  "mobile" => "545466555"
  "facebook" => "https://facebook.com/profile/pp"
  "twitter" => "https://twitter.com"
  "youtube" => null
  "instagram" => null
  "user_id" => "132"
]

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Вы можете использовать метод associate.

$user->profile()->associate($user);

Для получения дополнительной информации: Документы

0 голосов
/ 30 марта 2020

вам нужно изменить запрос в пользовательском контроллере на:

$user->profile()->create($user->toArray())->save();

, вы также можете увидеть этот пример

...