Правильно ли я понял, то, что метод belongsToMany, обязательно обратится к трём таблицам? Например, есть таблицы students, groups и group_student. И этот метод будет искать классы group и student и когда найдёт, то потом будет искать таблицы в базе с таким же название и автоматически подставит окончание s? А потом уже автоматически соединит эти названия таблиц, через нижнее подчёркивание и будет искать эту таблицу group_student?
Многие-ко-многим делаются через третью таблицу. Всегда. Да, имя таблицы формируется автоматически, если ты не указал явно. Также как и ключи. Можно при желании и явно указать.
@mkramer А как можно вытащить title из таблицы groups? PHP: <?php namespace App; use Illuminate\Database\Eloquent\Model; class Group extends Model{ public function students() { return $this->belongsToMany('App\Student'); } } PHP: $bbb = Group::find(1)->students; PHP: echo '<pre>'; print_r( $bbb[1]); echo '</pre>'; Имена из другой таблицы выводит $bbb[1]->name а названия кружков не могу вывести, хотя они есть в массиве Так ничего не выводит $bbb[1]->title PHP: App\Student Object ( [perPage:protected] => 15 [exists] => 1 [wasRecentlyCreated] => [attributes:protected] => Array ( [id] => 2 [name] => Дима [class_table_id] => 3 ) [original:protected] => Array ( [id] => 2 [name] => Дима [class_table_id] => 3 [pivot_group_id] => 1 [pivot_student_id] => 2 ) [relations:protected] => Array ( [pivot] => Illuminate\Database\Eloquent\Relations\Pivot Object ( [parent] => App\Group Object ( [connection:protected] => mysql [table:protected] => [primaryKey:protected] => id [keyType:protected] => int [incrementing] => 1 [with:protected] => Array ( ) [withCount:protected] => Array ( ) [perPage:protected] => 15 [exists] => 1 [wasRecentlyCreated] => [attributes:protected] => Array ( [id] => 1 [title] => Рисование ) [original:protected] => Array ( [id] => 1 [title] => Рисование ) [relations:protected] => Array ( [students] => Illuminate\Database\Eloquent\Collection Object ( [items:protected] => Array ( [0] => App\Student Object ( [connection:protected] => mysql [table:protected] => [primaryKey:protected] => id [keyType:protected] => int [incrementing] => 1 [with:protected] => Array ( ) [withCount:protected] => Array ( ) [perPage:protected] => 15 [exists] => 1 [wasRecentlyCreated] => [attributes:protected] => Array ( [id] => 1 [name] => Вася [class_table_id] => 1 ) [original:protected] => Array ( [id] => 1 [name] => Вася [class_table_id] => 1 [pivot_group_id] => 1 [pivot_student_id] => 1 ) [dateFormat:protected] => [appends:protected] => Array ( ) [events:protected] => Array ( ) [observables:protected] => Array ( ) [relations:protected] => Array ( [pivot] => Illuminate\Database\Eloquent\Relations\Pivot Object ( [parent] => App\Group Object *RECURSION* [foreignKey:protected] => group_id [relatedKey:protected] => student_id [guarded:protected] => Array ( ) [connection:protected] => mysql [table:protected] => group_student [primaryKey:protected] => id [keyType:protected] => int [incrementing] => 1 [with:protected] => Array ( ) [withCount:protected] => Array ( ) [perPage:protected] => 15 [exists] => 1 [wasRecentlyCreated] => [attributes:protected] => Array ( [group_id] => 1 [student_id] => 1 ) [original:protected] => Array ( [group_id] => 1 [student_id] => 1 ) ) ) [1] => App\Student Object *RECURSION* ) ) ) [touches:protected] => Array ( ) ) ) --- Добавлено --- Вывод всего массива, немного обрезал.
Group::find(1)->title, или что там у тебя Ты что-то странные такие вопросы задаёшь Почитай внимательно доку!
Когда я решил делать первый проект на Laravel, я сначала потратил пару дней и прочитал всю доку целиком, причём, не просто просмотрел, а именно так, чтоб понять. Не заучил, правда, некоторые заучивают, но разобрался. Сейчас она всегда у меня открыта в браузере, когда программирую. Также было с Yii2, также было c Kohana. Если завтра позарез понадобится Symphony, хоть она мне и не нравится, тоже сначала прочитаю всю доку. Когда нормальная дока, это благо. Вот я сейчас Magento осваиваю, на работе дали задание, так там вообще официальная дока для программиста и десятой части функционала не охватывает, и это жопа, я седею потихоньку. А у Laravel - всё почти написано, только читай.
Ну я пару разделов доки прочитал, показалось неудобным. Чисто субъективно, естественно. Ничего плохого сказать не могу объективно, тем более, что Laravel большей частью является надстройкой над компонентами Symphony --- Добавлено --- Я вообще Yii2 предпочитаю, у меня на нём скорость разработки выше. Да и сайты обычно работают быстрее, чем на Laravel при схожей функциональности
@S_t_e_e_p ну реально статьи не очень хорошие, постоянно приходится перерыть весь интернет и найти хорошее, подробное объяснение. --- Добавлено --- @mkramer а как узнать, какое название таблицы сделать group_student или student_group?
The role_user table is derived from the alphabetical order of the related model names, and contains the user_id and role_id columns.
Как можно вывести список статей и рядом пользователя данной статьи? PHP: class User extends Authenticatable { use Notifiable; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'email', 'password', ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; public function posts() { return $this->hasMany('App\Post'); } PHP: <?php namespace App; use Illuminate\Database\Eloquent\Model; class Post extends Model { public $fillable = [ 'title', 'slug', 'content', 'date', 'user_id' ]; public function user() { return $this->belongsTo('App\User'); } Вывожу список всех пользователей PHP: $post = Post::all(); foreach($post as $p) { echo $p->user . '<br>'; } Код (Text): {"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"} {"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"} {"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"} {"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"} {"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"} {"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: $users = User::all(); foreach($users as $u) { echo $u->posts . '<br>'; echo '<br>'; } Код (Text): [{"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"}] [{"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"}] [{"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"}] [{"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"}] [{"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"}] Как можно это объединить, что бы вывести пользователя для каждой статьи?
Я нашёл способ PHP: <?php namespace App; use Illuminate\Database\Eloquent\Model; class Post extends Model { public $fillable = [ 'title', 'slug', 'content', 'date', 'user_id' ]; public function user() { //return $this->belongsTo('App\User'); return $this->belongsTo(User::class); } public function hasUser() { return $this->user != null ? true : false; } public function getUserName() { return ($this->user != null) ? $this->user->name : ''; } PHP: $post = Post::all(); foreach($post as $p) { echo '<div style="border: 1px solid green">'; echo '<span style="color: red; font-weight: bold">Название статьи</span> '; echo $p->title . '<br>'; echo '<span style="color: red; font-weight: bold">Содержание</span> '; echo $p->content. '<br>'; echo '<span style="color: red; font-weight: bold">Автор</span> '; echo $p->getUserName(). '<br>'; echo '</div><br>'; } --- Добавлено --- Оказывается так тоже работает $p->user->name --- Добавлено --- Вечно забываю, что модель получает все поля из базы --- Добавлено --- не привык ещё к eloquenty
Хочу вывести все статьи у пользователя, почему пишет Код (Text): Property [posts] does not exist on this collection instance. PHP: <?php namespace App; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { use Notifiable; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'email', 'password', ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; public function posts() { return $this->hasMany('App\Post', 'user_id'); } PHP: <?php namespace App; use Illuminate\Database\Eloquent\Model; class Post extends Model { public $fillable = [ 'title', 'slug', 'content', 'date', 'user_id' ]; public function user() { //return $this->belongsTo('App\User'); return $this->belongsTo(User::class, 'user_id'); } PHP: $users = User::all(); foreach ($users->posts as $post) { dump($post); } --- Добавлено --- Вот так получилось PHP: $user = User::find(1); foreach ($user->posts as $post) { dump($post); }
вот допустим, можно статью засовывать в разные категории, тогда лучше для этого сделать отдельную таблицу и использовать связь многие ко многим?
@Dimon2x, тебе в кайф такие вопросы задавать? У одной статьи есть много категорий, у одной категории есть много статей. Какое отношение?
@igordata а чем один ко многим не нравится? --- Добавлено --- Можно сделать любым отношением, но я не знаю, какое будет правильней --- Добавлено --- Многие ко многим?
хули ты спрашиваешь подумай блин, подумай. речь не о том, чтобы мы тебе сказали ответ. а о том, чтобы ты подумал одна категория - много статей одна статья - много категорий как соотносятся категории и статьи? одна статья - один автор один автор - много статей как соотносятся авторы и статьи?
@Dimon2x, тут чисто теоретический вопрос, который тебе уже где-то я разжёвывал. Не надо код, вот @igordata предложил два варианта. У тебя есть две сущности. Нарисуй их, и посмотри с каждой из сторон, что там будет. Спойлер: Отношения, картинка Вот раскрой спойлер, и на основе того, что тебе @igordata дал поставь вместо вопроса 1 или n. К примеру, берёшь с точки зрения статьи, сколько у неё авторов, и если 1, то ставишь 1, если много, ставишь n, нарисуй также в паинте и запости сюда. Не надо сразу мыслить кодом, тем более Laravel-ем. Никто так не делает, поверь. Насколько быстро от подобной картинки переходишь к коду - это зависит от сложности задачи и опыта, возможно картинку такую просто в голове представляешь, а не рисуешь, но по любому эту стадию надо пройти перед кодированием. А потом уже смотришь, как сделать в коде, на Laravel или без Laravel и т.п.
@mkramer С автором и статьёй также. --- Добавлено --- @igordata одна категория - много статей Многие к одному одна статья - много категорий Многие ко многим --- Добавлено --- одна статья - один автор один к одному один автор - много статей многие к одному
это вообще-то одна и та же связь как она может быть разных типов одновременно? --- Добавлено --- @nospiou ты правильно написал по сути. одна статья, один автор = можешь запостить только одну статью на аккаунт.