Laravel не возвращает правильный внешний ключ после обновления объекта - PullRequest
0 голосов
/ 03 апреля 2020

enter image description here

Приведенный выше код генерируется следующим образом:

$post = Post::findOrFail($postId);

echo "category id: " . $post->category->id."<br />";
echo "category name: ". $post->category->name;
dd($post);
exit;

Почтовая модель :

class Post extends Model
{
   protected $table = 'posts';

   public function category() {
      return $this->hasOne(Category::class, 'id');
   }
}

Модель категории :

class Category extends Model
{
   protected $table = 'categories';
}

Миграция и заполнение базы данных прошло успешно, однако после обновления записи Post значение внешнего ключа не изменилось.

Миграция :

public function up()
{
    Schema::create('posts', function (Blueprint $t) {
        $t->bigIncrements('id');
        $t->timestamps();
        $t->unsignedBigInteger('category_id');
        $t->foreign('category_id')
                ->references('id')->on('categories')
                ->onDelete('cascade');
        $t->string('title', 255);
        $t->string('description', 255);
    });
}

Обновление записи :

$post_id = $data->post_id;
$category_id = $data->category_id;
$title = $data->title;
$description = $data->description;

$post = Post::where('id', $post_id)->first();

$post->category_id = $category_id;
$post->title = $title;
$post->description = $description;

$post->save();

Я проверил базу данных, запись обновлена (даже внешний ключ), однако после получения $post->category->id возвращает мне старое значение.

Вот скриншот из базы данных:

enter image description here

Обновление Похоже, что при печати $post->category->id вместо идентификатора категории отображается идентификатор сообщения.

1 Ответ

1 голос
/ 04 апреля 2020

Когда вы просто перезаписываете атрибуты, вы не всегда можете гарантировать, что категория будет правильной. Если вы используете встроенные функции в Laravel, он перезагрузит категорию.

Попробуйте использовать этот подход и посмотрите, работает ли он.

$post->category()->associate(Category::find($category_id));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...