У меня есть 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'=>'[email protected]',password='']);
$address = Address::create(['name'=>'sample address of user 1']);
$address->user()->associate($user);
});
Все было сохранено, но я ожидал, что user_id адреса будет 1. Вместо этого user_id адреса был установлен в NULL. Разве associate () не предполагает связать конкретную модель ‘ownTo’ со своим родителем, автоматически назначая внешний ключ, равный идентификатору родителя? Кстати, я очень новичок в PHP и Laravel, так что да ..
Ваша модель адреса должна иметь отношение к пользователю.
например:
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');
});
Вам все еще нужно save
объект для хранения значения.
Как документация говорит:
Принадлежит к отношениям
При обновлении отношения ownTo вы можете использовать
метод. Этот метод установит внешний ключ на дочерней модели:$account = App\Account::find(10); $user->account()->associate($account); $user->save();
Итак, как вы можете видеть, после этого:
$address->user()->associate($user);
вам нужно сделать это:
$address->save();