Associate () в 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'=>'[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, так что да ...

Привет! Попробуй потом добавить $address->save();

kravis 09.04.2018 05:00

Возможный дубликат Не могу заставить сотрудника Laravel работать

kravis 09.04.2018 05:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
5 457
2

Ответы 2

Ваша модель адреса должна иметь отношение ownTo User. например:

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

Он уже имеет отношение BelongsTo, это было указано выше .. У меня только что была опечатка, когда я писал здесь код .. извините

Jp Arcilla 09.04.2018 05:17

Извините, я не вижу, где у вас есть отношения пользователя в вашей модели адреса.

CUGreen 09.04.2018 05:19

Повторно отредактировал код в этом посте. Еще одна опечатка, когда я писал здесь код.

Jp Arcilla 09.04.2018 05:21

@JpArcilla, CUGReen прав, модель Address не имеет функции user (), и в вашем веб-файле вы пытаетесь получить к нему доступ

Hussein 09.04.2018 05:21

Вы установили ограничения внешнего ключа в своей миграции / базе данных?

CUGreen 09.04.2018 05:23

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

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

Belongs To Relationships

When updating a belongsTo relationship, you may use the associate method. This method will set the foreign key on the child model:

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

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

$user->save();

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

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

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

$address->save();

Другие вопросы по теме