Связывание таблиц Laravel

D
На сайте с 28.06.2008
Offline
1104
166

Пытаюсь понять как работает связывание таблиц в Ларавеле.

Есть две таблицы юзерс 

INSERT INTO `users` (`id`, `name`, `surname`, `age`, `city_id`)

Ситис

INSERT INTO `cities` (`id`, `name`)

Прописал связывание, в модели юзер

    public function city()
    {
        return $this->hasOne('App\City');
    }

В модели Сити

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

И допустим теперь я хочу вывести куданить любого юзера и его город.

СОздал контроллер и так и сяк крутил, наговнокодил только это, но явно же как то должно по другому работать, нет?

    public function index()
    {
        $user = \App\User::find('1')->name;
        $city = \App\City::find(\App\User::find('1')->city_id)->name;

        return view('users.city', ['user' => $user, 'city' => $city]);
    }


vitor
На сайте с 16.05.2009
Offline
231
#1
Я уже подзабыл немного, но если все правильно то у User::class должно появится свойство-объект city. По моему там нужно прописать еще имена таблицы в hasOne и belongsTo. Есть прекрасный ресурс для русскоязычных, там есть почти все ответы на ваши вопросы https://laravel.ru/
D
На сайте с 28.06.2008
Offline
1104
#2
vitor #:
Я уже подзабыл немного, но если все правильно то у User::class должно появится свойство-объект city. По моему там нужно прописать еще имена таблицы в hasOne и belongsTo. Есть прекрасный ресурс для русскоязычных, там есть почти все ответы на ваши вопросы https://laravel.ru/

Я там доки и читаю, хоть там и 5 версия, а у меня 8, ну не суть...  

На счет свойства, это было первое что я попробовал после чтения доков

$users = \App\User::find('1')->city;

В итоге ошибка

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'cities.user_id' in 'where clause' (SQL: select * from `cities` where `cities`.`user_id` = 1 and `cities`.`user_id` is not null limit 1)

Далее я пробовал указать столбец по которому должно идти связывание в модели Сити

    public function user()
    {
        return $this->belongsTo('App\User', 'user_id');
    }

Не помогло...  Пробовал это поле указать и в моделе Сити - то же без толку

D
На сайте с 28.06.2008
Offline
1104
#3

Может кому-то пригодится

В модели юзер указал что искать города нужно по полю ID

    public function city()
    {
        return $this->hasOne('App\City', 'id');
    }

В контроллере так

    public function index()
    {
        $users = \App\User::find('1');
        return view('users.city', ['users' => $users]);
    }

В представлении так

Юзер - {{$users->name}}, город {{$users->city->name}}

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий