Laravel по-русски

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

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

#1 08.02.2018 11:16:48

Модели и отношения.

Привет, Знающим.

Подскажите правильно ли я понял материал?

Есть таблица firms

namespace App\Model;

use Illuminate\Database\Eloquent\Model;

// названи фирм
class Firm extends Model
{
    //
    protected $table = "firms";
    protected $primaryKey = 'id';
    protected $fillable = [
    	'name'
    ];
    protected $dates =[
    	'created_at', 'updated_at'
    ];
}

также есть таблица user_names

namespace App\Model;

use Illuminate\Database\Eloquent\Model;

class User_name extends Model
{
    //
    protected $table = 'user_names';
    protected $primaryKey = 'id';
    protected $fillable = [
    	'name_1',
    	'name_2',
    	'name_2',
    	'mob_tel',
    	'internal_tel',
    	'email',
    	'birthday', 	       
        'firm_id'
    ];
    protected $dates = [
        'created_at', 'updated_at'
    ];
    
    // Название фирм
    public function firm()
    {   
        return $this->belongsTo(Firm::class, 'firm_id');
    }

Вот код вывода данных пользователя

public function showUser(int $id)
    {
        $objUser_name   = new User_name();
        $user_names     = $objUser_name->where('id', $id)->get();
        $user_names->firm_id           = $objUser_name->find($id)->firm->name;
        
        dd($user_names->firm_id );
    }

Меня интересует правильно ли я использую "зависимости" или существут еще проще вариант для вывода названия фирмы ?

Не в сети

#2 08.02.2018 11:55:44

Re: Модели и отношения.

По соглашениям модели пишутся в CamelCase, т.е. UserName. Это хороший тон.

    public function firm()
    {   
        return $this->belongsTo(Firm::class, 'firm_id');
    }

т.к. у класса Firm указана таблица firms, laravel предполагает (убирая множественное число "s" из firms), что внешний ключ может быть firm_id, т.е. firm_id указывать необязательно, но, это совсем не принципиально.

        $user_names->firm_id           = $objUser_name->find($id)->firm->name;
        
        dd($user_names->firm_id );

для чего здесь присваивается в $user_names атрибут firm_id, если он уже должен быть и более того, какой смысл присваивать в firm_id name??

Для использования QueryBuilder, не обязательно создавать новый экземпляр класса модели, можно так:

public function showUser(int $id)
    {
        $userNames = User_name::query()->where('id', $id)->firstOrFail();        
        dd($userNames->firm_id );
    }

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

Изменено covobo (08.02.2018 11:56:51)

Не в сети

#3 08.02.2018 13:22:09

Re: Модели и отношения.

Ну теперь это явно облегчает работу. А то я намудрил "букв", а толку мало. big_smile

Спасибо!

Не в сети

#4 08.02.2018 13:29:38

Re: Модели и отношения.

И еще один вопрос. Что бы получить название фирмы мне надо обратится

$userNames->firm->name; 

Правильно ли будет если сделать так?

$userNames->firm = $userNames->firm->name;

или это с точки зрения laravel не логично и не правильно?

Не в сети

#5 08.02.2018 15:47:17

Re: Модели и отношения.

Задам тебе встречный вопрос.

Почему у тебя возникает желание переопределить переменную firm (а на самом деле определить, т.к. ->firm отлавливается через __get)?
Если тебе понадобится еще что-то, кроме названия, как ты предполагаешь это сделать?

Первый вариант - правильный, так ты получишь название фирмы (если фирма есть).
Второй вариант - делает тоже самое, но какой смысл в этом - я не знаю. Ты ведь фактически определил переменную firm и больше не сможешь обратиться к фирме, как к модельке.

Изменено covobo (09.02.2018 01:11:55)

Не в сети

#6 08.02.2018 16:08:19

Re: Модели и отношения.

ОК, я понял свою ошибку.
Правильно не переопределять ... Я просто еще не дошел до надобности использовать какие-то дополнительные данные из массива.

Не в сети

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