Делаю всё по инструкции. Создал класс PHP: ?php namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model { protected $table = 'my_flights'; public static function flights() { return $this->hasOne('App\User'); } } И обращаюсь PHP: $name = Flight::flights(3)->user_id; И выводит PHP: Using $this when not in object contex Как сделать, что бы заработало? Зачем эти разработчики, написали этот код, не не показали, как его использовать? PHP: public function phone() { return $this->hasOne('App\Phone'); } https://laravel.com/docs/5.4/eloquent-relationships
Сделал так PHP: <?php namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model { protected $table = 'my_flights'; public function user() { return $this->belongsTo('App\User'); } } PHP: $event = Flight::find(3)->user_id; $user = User::find($event)->name; dd($user); Выводит имя юзера у статьи, даже, если убрать метод user(), тогда для чего он нужен?
По какой инструкции метод flights должен быть static? Почему ты в static-методе обращаешься к $this? показали: Код (Text): $phone = User::find(1)->phone; Чтобы писать Код (Text): Flight::find(3)->user->name Ты только код, по ходу, читаешь, да и то не очень внимательно. А самое важное --- Добавлено --- Да и вообще весь текст. Тут тебе где-то ссылку давали на русскую доку по 5.4, попробуй её почитать, только каждое слово, внимательно. --- Добавлено --- У меня, слава Богу, с техническим английским проблем нету (хотя в целом уровень знания языка средний), поэтому я даже не искал на русском.
Ты просто не въезжаешь, что значит hasOne. One user has one phone - у одного пользователя есть один телефон. Т.е. задача не предполагает, что у него их может быть два, или три или четыре. Только один. И чтобы получить этот телефон, надо сначала определиться, чей именно телефон ты хочешь получить. Поэтому hasOne не как не может быть использована в статическом методе - она не возвращает вообще любые телефоны. она должна возвратить телефон конкретного юзера. Теперь что это значит на языке реляционных баз данных. Здесь всё просто, и one-to-one не сильно отличается от one-to-many. Значит у тебя две таблицы, users и phones. И в phones у тебя есть поле user_id, по которому ты можешь соотнести конкретную строку users с конкретной строкой phones.
hasOne - имеет один (одну, одно). hasMany - имеет много. И теперь расскажи, если у пользователя много статей, он hasOne или hasMany ? --- Добавлено --- На уровне базы, ещё раз, one-to-one от one-to-many не отличается практически, но запросы и обработку результатов запроса фреймворк делает разные, в зависимости от типа связи, который ты указал. Хотя, и на уровне базы, если бы у меня users - phones было one-to-one, то я бы, к примеру, в phones сделал user_id уникальным ключом.
Вот, всё просто, на самом деле. А по поводу, когда hasOne, а когда belongsTo - это зависит от того, у кого внешний ключ. Т.е. если у phones user_id, то User hasOne Phone, а Phone belongsTo User.
@mkramer Ну вот делаю всё строго по инструкции https://laravel.ru/docs/v5/eloquent-relationships#oo Создал таблицу phones (id, marka) и добавил марки. В таблицу users добавил поле phone_id и заполнил для каждого юзера В Модели User добавил PHP: public function phone() { return $this->hasOne('App\Phone'); } Пишу $phone = User::find(1)->phone; и выводит null, почему? Надо ли создавать модель Phones, ведь в инструкции про это не говориться. --- Добавлено --- Добавил класс, всё равно выводит null PHP: <?php namespace App; use Illuminate\Database\Eloquent\Model; class Phone extends Model{ public function user() { return $this->belongsTo('App\User'); } }
@mkramer делаю по этой инструкции https://gist.github.com/greabock/3d1611c1125f5340f491 PHP: class Student extends Eloquent{ public function cabinet() { return $this->hasOne('Cabinet'); } } class Cabinet extends Eloquent{ public function student() { return $this->belongsTo('Student'); } } Запускаю всё работает PHP: $phone = Student::find(1)->id; $aaa = Cabinet::find($phone)->student_id; echo '<pre>'; print_r($phone); echo '</pre>'; echo '<pre>'; print_r($aaa); echo '</pre>'; Потом убрал методы cabinet и student и результат тот же самый, тогда для чего эти методы?