Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 22.10.2020 00:16:43

Получить данные для пользователя из другой таблицы

Доброго времени суток. Нужна ваша помощь. Пытаюсь получить для пользователя (таблицы users) по его authid, данные которые хранятся в другой таблице (в моем случаи points).
Делал так:
User.php

class User extends Authenticatable
{
    use HasFactory, Notifiable;

public function shop(){
    return $this->belongsTo(Shop::class,'auth');
}

Shop.php

class Shop extends Model
{
    use HasFactory;

    protected $table="shop_players";

    public function user(){
        return $this->HasMany(User::class);
    }
}

main.blade.php

{{Auth::user()->shop()->points}}

В результате получаю ошибку:
Undefined property: Illuminate\Database\Eloquent\Relations\BelongsTo::$points (View: /var/www/www-root/data/www/top-5ive.ru/resources/views/main.blade.php)
Где была допущена ошибка?

Не в сети

#2 22.10.2020 05:13:35

Re: Получить данные для пользователя из другой таблицы

1. Ты написал что внешний ключ это поле authid, а в описании класса у тебя 'auth'. Где-то ты ошибся.
2. ->shop() возвращает объект типа Отношение. A чтобы получить связаный объект типа Shop, надо писать ->shop без скобок, как если бы это было свойство, а не метод.

Я сам так делаю и всем рекомендую: в tinker проверяю правильно ли я описал отношения.
В моём случае у User есть отношения favorites (как hasMany) и country (как belongsTo):

$ php artisan tinker
Psy Shell v0.9.12 (PHP 7.2.33-1+ubuntu16.04.1+deb.sury.org+1 — cli) by Justin Hileman
>>> $user = App\User::first()
=> App\User {#4652
     id: 30,
. . .
   }
>>> $user->favorites()->count()
=> 0
>>> $user->country()
=> Illuminate\Database\Eloquent\Relations\BelongsTo {#4656}
>>> $user->country
=> App\Country {#4660
     id: 1,
     name: "United States",
     short_code: "USA",
     telephone_code: "+1",
     alpha2_code: "US",
     iso_code: "",
   }

Изменено artoodetoo (22.10.2020 05:20:59)


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#3 22.10.2020 05:24:30

Re: Получить данные для пользователя из другой таблицы

P.S. Если будешь проверять в tinker, имей в виду: он не замечает изменений в файлах php, которые произошли после его запуска. Надо выйти (Ctrl+C) и зайти в него снова чтобы применить изменения.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#4 22.10.2020 23:51:18

Re: Получить данные для пользователя из другой таблицы

Здраствуйте!
Что мне надо сделать, я написал в скриншоте.
Вот скриншот (https://prnt.sc/v4un4o)
В тинкер все показывает нормально.

root@ubuntu:/var/www/www-root/data/www/sitr.ru# php artisan tinker
Psy Shell v0.10.4 (PHP 7.4.11 — cli) by Justin Hileman
>>> App\Models\User::first();
=> App\Models\User {#4007
     id: 1,
     name: "MOK4SS",
     created_at: "2020-10-18 22:47:31",
     updated_at: "2020-10-18 22:47:31",
     auth: "STEAM_0:1:449661230",
   }
App\Models\Shop {#3294
     id: 1,
     name: "MOK4SS",
     auth: "STEAM_1:1:449661230",
     money: 99678789,
   }

При попытке

$points = Auth::User()->shop->money;
>>> $points = Auth::User()->shop->money;
PHP Notice:  Trying to get property 'shop' of non-object in /var/www/www-root/data/www/site.rueval()'d code on line 1
PHP Notice:  Trying to get property 'money' of non-object in /var/www/www-root/data/www/site.rueval()'d code on line 1
=> null

Пожалуйста помогите.

Не в сети

#5 23.10.2020 06:44:21

Re: Получить данные для пользователя из другой таблицы

читаем в документации (перевод на этом сайте)

Если ваша родительская модель не использует id в качестве первичного ключа, или вам бы хотелось присоединить дочернюю модель к другому столбцу, вы можете передать третий параметр в метод belongsTo(), который определяет имя связанного столбца в родительской таблице

Изменено vavprog (23.10.2020 06:45:38)

Не в сети

Подвал раздела