Laravel 7 как получить псевдоним родительской категории (nested-eloquent)? - PullRequest
0 голосов
/ 12 апреля 2020

В Laravel 7, как получить родительскую категорию alias?

У меня есть две таблицы:

        Schema::create('blog_categories', function (Blueprint $table) {
            $table->id();

            $table->bigInteger('parent_id')->unsigned()->default(1);
            $table->string('alias')->unique();
            $table->string('title');
            $table->string('description')->nullable();

            $table->timestamps();
            $table->softDeletes();
        });

        Schema::create('blog_posts', function (Blueprint $table) {
            $table->id();

            $table->bigInteger('category_id')->unsigned();
            $table->bigInteger('user_id')->unsigned();

            $table->string('alias')->unique();
            $table->string('title');
            $table->text('fragment')->nullable();
            $table->text('content_html');

            $table->boolean('is_published')->default(false);
            $table->timestamp('published_at')->nullable();

            $table->timestamps();
            $table->softDeletes();

            $table->foreign('user_id')->references('id')->on('users');
            $table->foreign('category_id')->references('id')->on('blog_categories');
            $table->index('is_published');
        });

В моделях:

class BlogPost extends Model
{

    public function category()
    {
        return $this->belongsTo(BlogCategory::class);
    }

    public function parentCategory()
    {
        return $this->belongsTo(BlogCategory::class,
            'id', 'parent_id');
    }

}
class BlogCategory extends Model
{
     public function parentCategory()
    {
        return $this->belongsTo(BlogCategory::class,
            'parent_id', 'id');
    }
}

И маршрут:

Route::group(['namespace' => 'Blog', 'prefix' => 'blog'], function () {
    Route::get('posts', 'BlogPostController@index')->name('blog.posts');
    Route::get('{parentCategory}{category}/{alias}', 'BlogPostController@showPost')->name('user.blog.showPost');
});

В контроллере у меня есть следующий метод:

    public function index()
    {
        $getAllWithPaginate = $this->blogPostRepository->getAllWithPaginate();

        return view('blog', compact('getAllWithPaginate'));
    }

В представлении я могу получить доступ к $item->category->alias и $item->alias, но как можно Я имею доступ к псевдониму родительской категории?

    @foreach ($getAllWithPaginate as $item)
       <a href="{{ route('user.blog.showPost', [**question here (how get parent category alias?)**, $item->category->alias, $item->alias]) }}" class="for-posts-link">
    @enforeach

Что-то вроде этого параметра parentCategory->alias в маршруте? Спасибо за любую помощь.

1 Ответ

1 голос
/ 13 апреля 2020

Я думаю, что проблема в красноречивом соглашении об именах, есть два способа сделать это. 1) Создайте красноречивый атрибут. 2) Создайте красноречивые отношения (что вы и сделали, но можно улучшить с помощью более условного способа сделать это.) Ниже приведен пример того, как я бы это сделал.

class BlogCategory extends Model
{
    public function parent()
    {
        return $this->belongsTo(BlogCategory::class,'parent_id', 'id');
    }
}

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

  {{ $item->category->parent->alias }}

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...