За последние 24 часа нас посетили 20380 программистов и 1013 роботов. Сейчас ищут 368 программистов ...

Один к одному

Тема в разделе "Laravel", создана пользователем Dimon2x, 20 июн 2018.

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    Делаю всё по инструкции.

    Создал класс

    PHP:
    1. ?php
    2.  
    3. namespace App;
    4.  
    5. use Illuminate\Database\Eloquent\Model;
    6.  
    7. class Flight extends Model
    8. {
    9.      protected $table = 'my_flights';
    10.    
    11.      public static function flights()
    12.     {
    13.         return $this->hasOne('App\User');
    14.        
    15.     }
    16. }
    И обращаюсь

    PHP:
    1. $name = Flight::flights(3)->user_id;
    И выводит

    PHP:
    1. Using $this when not in object contex
    Как сделать, что бы заработало?

    Зачем эти разработчики, написали этот код, не не показали, как его использовать?

    PHP:
    1. public function phone()
    2.     {
    3.         return $this->hasOne('App\Phone');
    4.     }
    https://laravel.com/docs/5.4/eloquent-relationships
     
  2. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    Сделал так

    PHP:
    1. <?php
    2.  
    3. namespace App;
    4.  
    5. use Illuminate\Database\Eloquent\Model;
    6.  
    7. class Flight extends Model
    8. {
    9.      protected $table = 'my_flights';
    10.  
    11.      public function user()
    12.     {
    13.         return $this->belongsTo('App\User');
    14.      
    15.     }
    16. }
    PHP:
    1. $event = Flight::find(3)->user_id;
    2. $user  = User::find($event)->name;
    3.      
    4. dd($user);
    Выводит имя юзера у статьи, даже, если убрать метод user(), тогда для чего он нужен?
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    По какой инструкции метод flights должен быть static? Почему ты в static-методе обращаешься к $this?
    показали:
    Код (Text):
    1.  
    2. $phone = User::find(1)->phone;
    Чтобы писать

    Код (Text):
    1. Flight::find(3)->user->name
    Ты только код, по ходу, читаешь, да и то не очень внимательно. А самое важное
    --- Добавлено ---
    Да и вообще весь текст. Тут тебе где-то ссылку давали на русскую доку по 5.4, попробуй её почитать, только каждое слово, внимательно.
    --- Добавлено ---
    У меня, слава Богу, с техническим английским проблем нету (хотя в целом уровень знания языка средний), поэтому я даже не искал на русском.
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Ты просто не въезжаешь, что значит hasOne.
    One user has one phone - у одного пользователя есть один телефон. Т.е. задача не предполагает, что у него их может быть два, или три или четыре. Только один. И чтобы получить этот телефон, надо сначала определиться, чей именно телефон ты хочешь получить. Поэтому hasOne не как не может быть использована в статическом методе - она не возвращает вообще любые телефоны. она должна возвратить телефон конкретного юзера.

    Теперь что это значит на языке реляционных баз данных. Здесь всё просто, и one-to-one не сильно отличается от one-to-many. Значит у тебя две таблицы, users и phones. И в phones у тебя есть поле user_id, по которому ты можешь соотнести конкретную строку users с конкретной строкой phones.
     
    Dimon2x нравится это.
  5. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    @mkramer то есть, с помощью hasOne, нельзя вывести весь список статей у пользователя?
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    hasOne - имеет один (одну, одно). hasMany - имеет много. И теперь расскажи, если у пользователя много статей, он hasOne или hasMany ?
    --- Добавлено ---
    На уровне базы, ещё раз, one-to-one от one-to-many не отличается практически, но запросы и обработку результатов запроса фреймворк делает разные, в зависимости от типа связи, который ты указал. Хотя, и на уровне базы, если бы у меня users - phones было one-to-one, то я бы, к примеру, в phones сделал user_id уникальным ключом.
     
  7. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    @mkramer hasMany, потому что надо несколько
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Вот, всё просто, на самом деле.

    А по поводу, когда hasOne, а когда belongsTo - это зависит от того, у кого внешний ключ. Т.е. если у phones user_id, то User hasOne Phone, а Phone belongsTo User.
     
  9. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    @mkramer Ну вот делаю всё строго по инструкции https://laravel.ru/docs/v5/eloquent-relationships#oo

    Создал таблицу phones (id, marka) и добавил марки.

    В таблицу users добавил поле phone_id и заполнил для каждого юзера

    В Модели User добавил

    PHP:
    1. public function phone()
    2.     {
    3.         return $this->hasOne('App\Phone');
    4.     }
    Пишу $phone = User::find(1)->phone;
    и выводит null, почему?

    Надо ли создавать модель Phones, ведь в инструкции про это не говориться.
    --- Добавлено ---
    Добавил класс, всё равно выводит null

    PHP:
    1. <?php
    2.  
    3. namespace App;
    4. use Illuminate\Database\Eloquent\Model;
    5.  
    6.  
    7. class Phone extends Model{
    8.  
    9.     public function user()
    10.     {
    11.     return $this->belongsTo('App\User');
    12.     }
    13. }
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    @Dimon2x, hasOne - это когда у phone есть user_id. Я тебе про это писал уже
     
  11. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    @mkramer делаю по этой инструкции https://gist.github.com/greabock/3d1611c1125f5340f491

    PHP:
    1. class Student extends Eloquent{
    2.  
    3.     public function cabinet()
    4.     {
    5.         return $this->hasOne('Cabinet');
    6.     }
    7. }
    8. class Cabinet extends Eloquent{
    9.  
    10.     public function student()
    11.     {
    12.         return $this->belongsTo('Student');
    13.     }
    14. }
    Запускаю всё работает
    PHP:
    1. $phone = Student::find(1)->id;
    2.    
    3.       $aaa = Cabinet::find($phone)->student_id;
    4.    
    5.       echo '<pre>';
    6.         print_r($phone);
    7.       echo '</pre>';
    8.    
    9.        echo '<pre>';
    10.         print_r($aaa);
    11.       echo '</pre>';
    Потом убрал методы cabinet и student и результат тот же самый, тогда для чего эти методы?
     
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Чтобы писать
    PHP:
    1. Student::find(1)->cabinet
    Без второго find. Его сам Laravel сделает
     
    Dimon2x нравится это.