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

У меня есть 2 модели, пользователь и адрес. Я все еще экспериментирую с Associate (), так как я прочитал его в https://laravel.com/docs/5.6/eloquent-relationships#updating-belongs-to-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, так что да ..

1

Решение

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

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');
});
0

Другие решения

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

Как документация говорит:

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

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

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

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

$user->save();

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

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

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

$address->save();
0