2/3 урок — связь сущностей между собой.

Наша задача на данном этапе состоит в том, чтобы прописать взаимосвязи между сущностями нашего блога между собой.
Откроем файл /app/Category.php
Класс должен выглядеть подобным образом

class Category extends Model
{
    use Sluggable;
    public function posts ()
    {
        return $this->hasMany(Post::class);
    }

    public function sluggable()
    {
        return [
            'slug' => [
                'source' => 'title'
            ]
        ];
    }
}

У сущности есть связь только с постом, в категории может быть 1 или более постов.


Это описывается функцией posts.
Вы можете заметить тут то, что для категории мы используем пакет, о котором я говорил ранее — Sluggable.
Это строка

use Sluggable;

И функция

    
public function sluggable()
    {
        return [
            'slug' => [
                'source' => 'title'
            ]
        ];
    }

Эти вещи нужно будет скопировать и вставить в нужные модели.

Далее идет сущность — Comment

class Comment extends Model
{
    public function post ()
    {
        return $this->hasOne(Post::class);
    }

    public function author ()
    {
        return $this->hasOne(User::class);
    }
}

Мы описали, что у комментария должен быть 1 post и 1 user.

Главная сущность нашего проекта — Post

class Post extends Model
{
    use Sluggable;
    public function category ()
    {
        return $this->hasOne(Category::class);
    }

    public function author ()
    {
        return $this->hasOne(User::class);
    }

    public function tags ()
    {
        return $this->belongsToMany(
            Tag::class,
            'post_tags',
            'post_id',
            'tag_id'
        );

        public function sluggable()
    {
        return [
            'slug' => [
                'source' => 'title'
            ]
        ];
    }
    }
}

Вот здесь уже больше подробностей.


Идем по порядку.
У поста может быть 1 категория.
У поста может быть 1 автор.
У поста может быть много тегов.
Остановимся тут.
Мы создали метод tags и описываем что эта функция и как должна делать — она может возвращать много тегов ( belongsToMany ), далее мы прописали модель, с которой мы связываемся (Tag::class,), связываемся мы через таблицу — ‘post_tags’, далее указывается id этой модели в таблице ‘post_tags’, и id тэга.
Модель Subscription пока пропустим и переходим к следующей — Tag.

class Tag extends Model
{
    use Sluggable;
    public function posts ()
    {
        return $this->belongsToMany(
            Post::class,
            'post_tags',
            'tag_id',
            'post_id'
        );
    }

    public function sluggable()
    {
        return [
            'slug' => [
                'source' => 'title'
            ]
        ];
    }
}

Похоже на Post? Да, я думаю тут все понятно и по два раза одно и тоже расписывать не стоит.


И последняя на данный момент модель — User.
В ней уже есть какой то стандартный ларавеловский код, в итоге этот класс должен выглядеть так

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(Post::class);
    }

    public function comments ()
    {
        return $this->hasMany(Comment::class);
    }
}

Тут мы используем hasMany — это значит, что 1 пользователь может иметь множество статей и множество комментариев.

На данный момент код является оооочень легким для чтения и главное понимания, человеком, который хотя бы что то то понимает в программировании.

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *