Ассоциированный () в Laravel

У меня есть 2 модели, пользователь и адрес. Я все еще экспериментирую с associate(), так как я прочитал его в https://laravel.com/docs/5.6/eloquent-relationships, но у меня возникли некоторые проблемы с его реализацией и, к сожалению, мое видео учебник не охватывает функцию associate().

class User extends Authenticatable
      public function address(){
      return $this->hasOne('App\Address');
}

class Address extends Model
      public function user(){
      return $this->belongsTo('App\User');
}

--web.php--

Route::get('/sample',function(){
$user = User::create(['name'=>'user 1','email'=>'user@laravel.com',password='']);
$address = Address::create(['name'=>'sample address of user 1']);

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

});

Все было сохранено, но я ожидал, что user_id адреса будет 1. Вместо этого user_id адреса был установлен в NULL. Разве associate() не предполагает связать конкретную модель 'ownTo' с ее родителем, автоматически назначая внешний ключ, равный идентификатору родителя? Кстати, я очень новичок в PHP и Laravel, так что да..

2 ответа

Вам все еще нужно save объект для хранения значения.

Как сказано в документации:

Принадлежит к отношениям

При обновлении отношения ownTo вы можете использовать метод Associate. Этот метод установит внешний ключ на дочерней модели:

$account = App\Account::find(10);

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

$user->save();

Итак, как вы можете видеть, после этого:

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

вам нужно сделать это:

$address->save();

Ваша модель адреса должна иметь отношение к пользователю. например:

class Address extends Model
    public function user() {
        return $this->belongsTo('App\User');
    }
}

Примечание: вам нужно убедиться, что у вас есть ограничение внешнего ключа

например, миграция:

Schema::table('addresses', function (Blueprint $table) {
    $table->unsignedInteger('user_id');

    $table->foreign('user_id')->references('id')->on('users');
});
Другие вопросы по тегам