За последние 24 часа нас посетили 21618 программистов и 1029 роботов. Сейчас ищут 773 программиста ...

Многие ко многим

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

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    Правильно ли я понял, то, что метод belongsToMany, обязательно обратится к трём таблицам?

    Например, есть таблицы students, groups и group_student.

    И этот метод будет искать классы group и student и когда найдёт, то потом будет искать таблицы в базе с таким же название и автоматически подставит окончание s?

    А потом уже автоматически соединит эти названия таблиц, через нижнее подчёркивание и будет искать эту таблицу group_student?
     
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Многие-ко-многим делаются через третью таблицу. Всегда.

    Да, имя таблицы формируется автоматически, если ты не указал явно. Также как и ключи. Можно при желании и явно указать.
     
  3. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    @mkramer А как можно вытащить title из таблицы groups?

    PHP:
    1. <?php
    2.  
    3. namespace App;
    4. use Illuminate\Database\Eloquent\Model;
    5.  
    6. class Group extends Model{
    7.    
    8.     public function students()
    9.     {
    10.         return $this->belongsToMany('App\Student');
    11.     }
    12. }
    PHP:
    1. $bbb = Group::find(1)->students;
    PHP:
    1.    echo '<pre>';
    2.         print_r( $bbb[1]);
    3.       echo '</pre>';
    4.        
    Имена из другой таблицы выводит

    $bbb[1]->name

    а названия кружков не могу вывести, хотя они есть в массиве

    Так ничего не выводит $bbb[1]->title

    PHP:
    1. App\Student Object
    2. (
    3.  
    4.  
    5.     [perPage:protected] => 15
    6.     [exists] => 1
    7.     [wasRecentlyCreated] =>
    8.     [attributes:protected] => Array
    9.         (
    10.             [id] => 2
    11.             [name] => Дима
    12.             [class_table_id] => 3
    13.         )
    14.  
    15.     [original:protected] => Array
    16.         (
    17.             [id] => 2
    18.             [name] => Дима
    19.             [class_table_id] => 3
    20.             [pivot_group_id] => 1
    21.             [pivot_student_id] => 2
    22.         )
    23.  
    24.  
    25.  
    26.     [relations:protected] => Array
    27.         (
    28.             [pivot] => Illuminate\Database\Eloquent\Relations\Pivot Object
    29.                 (
    30.                     [parent] => App\Group Object
    31.                         (
    32.                             [connection:protected] => mysql
    33.                             [table:protected] =>
    34.                             [primaryKey:protected] => id
    35.                             [keyType:protected] => int
    36.                             [incrementing] => 1
    37.                             [with:protected] => Array
    38.                                 (
    39.                                 )
    40.  
    41.                             [withCount:protected] => Array
    42.                                 (
    43.                                 )
    44.  
    45.                             [perPage:protected] => 15
    46.                             [exists] => 1
    47.                             [wasRecentlyCreated] =>
    48.                             [attributes:protected] => Array
    49.                                 (
    50.                                     [id] => 1
    51.                                     [title] => Рисование
    52.                                 )
    53.  
    54.                             [original:protected] => Array
    55.                                 (
    56.                                     [id] => 1
    57.                                     [title] => Рисование
    58.                                 )
    59.  
    60.                            
    61.  
    62.                          
    63.                             [relations:protected] => Array
    64.                                 (
    65.                                     [students] => Illuminate\Database\Eloquent\Collection Object
    66.                                         (
    67.                                             [items:protected] => Array
    68.                                                 (
    69.                                                     [0] => App\Student Object
    70.                                                         (
    71.                                                             [connection:protected] => mysql
    72.                                                             [table:protected] =>
    73.                                                             [primaryKey:protected] => id
    74.                                                             [keyType:protected] => int
    75.                                                             [incrementing] => 1
    76.                                                             [with:protected] => Array
    77.                                                                 (
    78.                                                                 )
    79.  
    80.                                                             [withCount:protected] => Array
    81.                                                                 (
    82.                                                                 )
    83.  
    84.                                                             [perPage:protected] => 15
    85.                                                             [exists] => 1
    86.                                                             [wasRecentlyCreated] =>
    87.                                                             [attributes:protected] => Array
    88.                                                                 (
    89.                                                                     [id] => 1
    90.                                                                     [name] => Вася
    91.                                                                     [class_table_id] => 1
    92.                                                                 )
    93.  
    94.                                                             [original:protected] => Array
    95.                                                                 (
    96.                                                                     [id] => 1
    97.                                                                     [name] => Вася
    98.                                                                     [class_table_id] => 1
    99.                                                                     [pivot_group_id] => 1
    100.                                                                     [pivot_student_id] => 1
    101.                                                                 )
    102.  
    103.                                                          
    104.                                                             [dateFormat:protected] =>
    105.                                                             [appends:protected] => Array
    106.                                                                 (
    107.                                                                 )
    108.  
    109.                                                             [events:protected] => Array
    110.                                                                 (
    111.                                                                 )
    112.  
    113.                                                             [observables:protected] => Array
    114.                                                                 (
    115.                                                                 )
    116.  
    117.                                                             [relations:protected] => Array
    118.                                                                 (
    119.                                                                     [pivot] => Illuminate\Database\Eloquent\Relations\Pivot Object
    120.                                                                         (
    121.                                                                             [parent] => App\Group Object
    122. *RECURSION*
    123.                                                                             [foreignKey:protected] => group_id
    124.                                                                             [relatedKey:protected] => student_id
    125.                                                                             [guarded:protected] => Array
    126.                                                                                 (
    127.                                                                                 )
    128.  
    129.                                                                             [connection:protected] => mysql
    130.                                                                             [table:protected] => group_student
    131.                                                                             [primaryKey:protected] => id
    132.                                                                             [keyType:protected] => int
    133.                                                                             [incrementing] => 1
    134.                                                                             [with:protected] => Array
    135.                                                                                 (
    136.                                                                                 )
    137.  
    138.                                                                             [withCount:protected] => Array
    139.                                                                                 (
    140.                                                                                 )
    141.  
    142.                                                                             [perPage:protected] => 15
    143.                                                                             [exists] => 1
    144.                                                                             [wasRecentlyCreated] =>
    145.                                                                             [attributes:protected] => Array
    146.                                                                                 (
    147.                                                                                     [group_id] => 1
    148.                                                                                     [student_id] => 1
    149.                                                                                 )
    150.  
    151.                                                                             [original:protected] => Array
    152.                                                                                 (
    153.                                                                                     [group_id] => 1
    154.                                                                                     [student_id] => 1
    155.                                                                                 )
    156.  
    157.                                                                         )
    158.  
    159.                                                                 )
    160.  
    161.  
    162.                                                     [1] => App\Student Object
    163. *RECURSION*
    164.                                                 )
    165.  
    166.                                         )
    167.  
    168.                                 )
    169.  
    170.                             [touches:protected] => Array
    171.                                 (
    172.                                 )
    173.  
    174.                          
    175.                         )
    176.  
    177.      
    178. )
    --- Добавлено ---
    Вывод всего массива, немного обрезал.
     
  4. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Group::find(1)->title, или что там у тебя :) Ты что-то странные такие вопросы задаёшь :) Почитай внимательно доку!
     
  5. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    @mkramer сложно всё сразу усвоить.
     
  6. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Когда я решил делать первый проект на Laravel, я сначала потратил пару дней и прочитал всю доку целиком, причём, не просто просмотрел, а именно так, чтоб понять. Не заучил, правда, некоторые заучивают, но разобрался. Сейчас она всегда у меня открыта в браузере, когда программирую. Также было с Yii2, также было c Kohana. Если завтра позарез понадобится Symphony, хоть она мне и не нравится, тоже сначала прочитаю всю доку. Когда нормальная дока, это благо. Вот я сейчас Magento осваиваю, на работе дали задание, так там вообще официальная дока для программиста и десятой части функционала не охватывает, и это жопа, я седею потихоньку. А у Laravel - всё почти написано, только читай.
     
  7. S_t_e_e_p

    S_t_e_e_p Активный пользователь

    С нами с:
    12 июл 2012
    Сообщения:
    181
    Симпатии:
    4
    В каждой теме пишут "-Читай доки" :)
     
  8. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    @mkramer а почему Symphony не нравится?
     
  9. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Ну я пару разделов доки прочитал, показалось неудобным. Чисто субъективно, естественно. Ничего плохого сказать не могу объективно, тем более, что Laravel большей частью является надстройкой над компонентами Symphony
    --- Добавлено ---
    Я вообще Yii2 предпочитаю, у меня на нём скорость разработки выше. Да и сайты обычно работают быстрее, чем на Laravel при схожей функциональности
     
  10. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    @S_t_e_e_p ну реально статьи не очень хорошие, постоянно приходится перерыть весь интернет и найти хорошее, подробное объяснение.
    --- Добавлено ---
    @mkramer а как узнать, какое название таблицы сделать group_student или student_group?
     
  11. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    The role_user table is derived from the alphabetical order of the related model names, and contains the user_id and role_id columns.
     
  12. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    Как можно вывести список статей и рядом пользователя данной статьи?

    PHP:
    1. class User extends Authenticatable
    2. {
    3.     use Notifiable;
    4.  
    5.     /**
    6.      * The attributes that are mass assignable.
    7.      *
    8.      * @var array
    9.      */
    10.     protected $fillable = [
    11.         'name', 'email', 'password',
    12.     ];
    13.  
    14.     /**
    15.      * The attributes that should be hidden for arrays.
    16.      *
    17.      * @var array
    18.      */
    19.     protected $hidden = [
    20.         'password', 'remember_token',
    21.     ];
    22.    
    23.     public function posts()
    24.     {
    25.         return $this->hasMany('App\Post');
    26.     }
    27.    
    PHP:
    1. <?php
    2.  
    3. namespace App;
    4.  
    5. use Illuminate\Database\Eloquent\Model;
    6.  
    7. class Post extends Model
    8. {
    9.     public $fillable = [
    10.         'title',
    11.         'slug',
    12.         'content',
    13.         'date',
    14.         'user_id'
    15.         ];
    16.    
    17.    
    18.     public function user()
    19.     {
    20.         return $this->belongsTo('App\User');
    21.     }
    Вывожу список всех пользователей

    PHP:
    1. $post = Post::all();
    2.    
    3.       foreach($post as $p) {
    4.         echo $p->user . '<br>';
    5.     }
    Код (Text):
    1. {"id":1,"name":"Dr. Cassie Heathcote II","email":"devon70@example.org","created_at":"2018-08-03 12:37:17","updated_at":"2018-08-03 12:37:17"}
    2. {"id":2,"name":"Jazmin Hoppe Sr.","email":"elouise20@example.net","created_at":"2018-08-03 12:37:17","updated_at":"2018-08-03 12:37:17"}
    3. {"id":3,"name":"Isidro Ratke","email":"etha.mueller@example.com","created_at":"2018-08-03 12:37:17","updated_at":"2018-08-03 12:37:17"}
    4. {"id":4,"name":"Nathaniel Walker","email":"jadon.oconner@example.net","created_at":"2018-08-03 12:37:17","updated_at":"2018-08-03 12:37:17"}
    5. {"id":5,"name":"Dr. Diamond Gislason III","email":"laura.kuhlman@example.org","created_at":"2018-08-03 12:37:17","updated_at":"2018-08-03 12:37:17"}
    6. {"id":1,"name":"Dr. Cassie Heathcote II","email":"devon70@example.org","created_at":"2018-08-03 12:37:17","updated_at":"2018-08-03 12:37:17"}
    Вывожу все статьи

    PHP:
    1.  $users = User::all();
    2.    
    3.      foreach($users as $u) {
    4.         echo $u->posts . '<br>';
    5.        echo '<br>';
    6.     }
    7.    
    Код (Text):
    1. [{"id":1,"title":"vel","slug":"aut-minima-et-voluptas","content":"Impedit voluptatem est unde illum deleniti. Iure sit repellendus voluptate ut corporis iure eos.","date":"1983-03-18","image":null,"status":0,"user_id":1,"created_at":"2018-08-03 12:37:17","updated_at":"2018-08-03 12:37:17"},{"id":6,"title":"sdff","slug":"3333","content":"dddddddddd","date":"2018-08-03","image":null,"status":0,"user_id":1,"created_at":"2018-08-03 14:03:30","updated_at":"2018-08-03 14:03:30"}]
    2.  
    3. [{"id":2,"title":"nihil","slug":"doloremque-iure-modi-magni-quae-eveniet","content":"Aliquid in sit quas dolor aliquam. Maxime voluptatem iste quia eligendi vitae et.","date":"1983-01-24","image":null,"status":0,"user_id":2,"created_at":"2018-08-03 12:37:17","updated_at":"2018-08-03 12:37:17"}]
    4.  
    5. [{"id":3,"title":"quam","slug":"voluptas-dolore-in-harum-eius-error-occaecati-in","content":"Exercitationem numquam earum debitis eos velit omnis consequatur. Explicabo unde beatae expedita mollitia quia rem. Dolorem numquam soluta est quisquam sapiente ea.","date":"2010-04-19","image":null,"status":0,"user_id":3,"created_at":"2018-08-03 12:37:17","updated_at":"2018-08-03 12:37:17"}]
    6.  
    7. [{"id":4,"title":"quidem","slug":"voluptas-sed-dolore-repellat-quia-maxime","content":"Aut error vitae est ea repellat. Sed et quis tempora. Qui dolores molestiae dolorem.","date":"2008-07-29","image":null,"status":0,"user_id":4,"created_at":"2018-08-03 12:37:17","updated_at":"2018-08-03 12:37:17"}]
    8.  
    9. [{"id":5,"title":"qui","slug":"illum-consequatur-ipsa-laboriosam-provident","content":"Mollitia velit minima delectus velit ducimus libero necessitatibus. Quam sit ut et dolorem illo. Non vitae rerum voluptate labore optio corporis. Ut veritatis qui earum ullam.","date":"1978-05-08","image":null,"status":0,"user_id":5,"created_at":"2018-08-03 12:37:17","updated_at":"2018-08-03 12:37:17"}]
    Как можно это объединить, что бы вывести пользователя для каждой статьи?
     
  13. Dimon2x

    Dimon2x Старожил

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

    PHP:
    1. <?php
    2.  
    3. namespace App;
    4.  
    5. use Illuminate\Database\Eloquent\Model;
    6.  
    7. class Post extends Model
    8. {
    9.     public $fillable = [
    10.         'title',
    11.         'slug',
    12.         'content',
    13.         'date',
    14.         'user_id'
    15.         ];
    16.    
    17.    
    18.     public function user()
    19.     {
    20.         //return $this->belongsTo('App\User');
    21.         return $this->belongsTo(User::class);
    22.     }
    23.    
    24.        public function hasUser()
    25.     {
    26.         return $this->user != null ? true : false;
    27.     }
    28.    
    29.       public function getUserName()
    30.     {
    31.         return ($this->user != null)
    32.                 ?   $this->user->name
    33.                 :   '';
    34.     }
    PHP:
    1.  $post = Post::all();
    2.    
    3.       foreach($post as $p) {
    4.           echo '<div style="border: 1px solid green">';
    5.            
    6.                 echo '<span style="color: red; font-weight: bold">Название статьи</span> ';
    7.                 echo $p->title . '<br>';
    8.            
    9.                 echo '<span style="color: red; font-weight: bold">Содержание</span> ';
    10.                 echo $p->content. '<br>';
    11.                
    12.                 echo '<span style="color: red; font-weight: bold">Автор</span> ';
    13.                 echo $p->getUserName(). '<br>';
    14.                
    15.             echo '</div><br>';
    16.            
    17.     }
    --- Добавлено ---
    Оказывается так тоже работает $p->user->name
    --- Добавлено ---
    Вечно забываю, что модель получает все поля из базы
    --- Добавлено ---
    не привык ещё к eloquenty
     
  14. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    Хочу вывести все статьи у пользователя, почему пишет

    Код (Text):
    1. Property [posts] does not exist on this collection instance.
    PHP:
    1. <?php
    2.  
    3. namespace App;
    4.  
    5. use Illuminate\Notifications\Notifiable;
    6. use Illuminate\Foundation\Auth\User as Authenticatable;
    7.  
    8. class User extends Authenticatable
    9. {
    10.     use Notifiable;
    11.  
    12.     /**
    13.      * The attributes that are mass assignable.
    14.      *
    15.      * @var array
    16.      */
    17.     protected $fillable = [
    18.         'name', 'email', 'password',
    19.     ];
    20.  
    21.     /**
    22.      * The attributes that should be hidden for arrays.
    23.      *
    24.      * @var array
    25.      */
    26.     protected $hidden = [
    27.         'password', 'remember_token',
    28.     ];
    29.  
    30.     public function posts()
    31.     {
    32.         return $this->hasMany('App\Post', 'user_id');
    33.     }
    PHP:
    1. <?php
    2.  
    3. namespace App;
    4.  
    5. use Illuminate\Database\Eloquent\Model;
    6.  
    7. class Post extends Model
    8. {
    9.     public $fillable = [
    10.         'title',
    11.         'slug',
    12.         'content',
    13.         'date',
    14.         'user_id'
    15.         ];
    16.  
    17.  
    18.     public function user()
    19.     {
    20.         //return $this->belongsTo('App\User');
    21.         return $this->belongsTo(User::class, 'user_id');
    22.     }

    PHP:
    1.  $users = User::all();
    2.  
    3.     foreach ($users->posts as $post) {
    4.         dump($post);
    5.      }
    --- Добавлено ---
    Вот так получилось

    PHP:
    1. $user = User::find(1);
    2.    
    3.    
    4.     foreach ($user->posts as $post) {
    5.         dump($post);
    6.     }
     
  15. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    вот допустим, можно статью засовывать в разные категории, тогда лучше для этого сделать отдельную таблицу и использовать связь многие ко многим?
     
  16. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    @Dimon2x, тебе в кайф такие вопросы задавать? У одной статьи есть много категорий, у одной категории есть много статей. Какое отношение?
     
  17. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    @mkramer один ко многим?
     
  18. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    а если подумать?
     
  19. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    @igordata а чем один ко многим не нравится?
    --- Добавлено ---
    Можно сделать любым отношением, но я не знаю, какое будет правильней
    --- Добавлено ---
    Многие ко многим?
     
  20. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    хули ты спрашиваешь :D подумай блин, подумай. речь не о том, чтобы мы тебе сказали ответ. а о том, чтобы ты подумал

    одна категория - много статей
    одна статья - много категорий
    как соотносятся категории и статьи?

    одна статья - один автор
    один автор - много статей
    как соотносятся авторы и статьи?
     
  21. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    послезавтра буду все варианты пробовать
     
  22. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    @Dimon2x, тут чисто теоретический вопрос, который тебе уже где-то я разжёвывал. Не надо код, вот @igordata предложил два варианта. У тебя есть две сущности. Нарисуй их, и посмотри с каждой из сторон, что там будет.
    upload_2018-8-12_20-46-58.png
    Вот раскрой спойлер, и на основе того, что тебе @igordata дал поставь вместо вопроса 1 или n. К примеру, берёшь с точки зрения статьи, сколько у неё авторов, и если 1, то ставишь 1, если много, ставишь n, нарисуй также в паинте и запости сюда. Не надо сразу мыслить кодом, тем более Laravel-ем. Никто так не делает, поверь. Насколько быстро от подобной картинки переходишь к коду - это зависит от сложности задачи и опыта, возможно картинку такую просто в голове представляешь, а не рисуешь, но по любому эту стадию надо пройти перед кодированием. А потом уже смотришь, как сделать в коде, на Laravel или без Laravel и т.п.
     
  23. Dimon2x

    Dimon2x Старожил

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

    С автором и статьёй также. отношения.png
    --- Добавлено ---
    @igordata

    одна категория - много статей
    Многие к одному

    одна статья - много категорий
    Многие ко многим
    --- Добавлено ---
    одна статья - один автор
    один к одному

    один автор - много статей
    многие к одному
     
  24. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    это вообще-то одна и та же связь :D как она может быть разных типов одновременно? :D
    --- Добавлено ---
    @nospiou ты правильно написал по сути. одна статья, один автор = можешь запостить только одну статью на аккаунт. :D
     
  25. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    вот вам ответ почему топикстартеру не нравится документация. потому что он, сyка, с ней не согласен :)