Проверить, не была ли опубликована родительская категория при вызове связанных с ней статей?

#laravel #eloquent #laravel-query-builder #laravel-8

#laravel #красноречивый #laravel-конструктор запросов #laravel-8

Вопрос:

Я использую laravel-nestedset для создания категории статей.

Laravel: 8 / laravel-nestedset: 5.0.3

Категории таблиц

 Schema::create('categories', function (Blueprint $table) {
      $table->increments('id');
      NestedSet::columns($table);
      $table->boolean('publish')->default(true);
      ...
 

Статьи таблицы

 Schema::create('articles', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('category_id')->unsigned()->nullable();
        $table->foreign('category_id')->references('id')->on('categories');
        ...
 

Я создал ветку и подраздел в таблице категорий следующим образом:

 news > politics
 

Я также создал две статьи и вставил их в разделы «новости» и «Политика«.

статья 1 в новостях

статья 2 в политике

Все работает!


Теперь у меня есть сценарий. Я хочу получить все статьи, которые находятся только в опубликованных категориях. (опубликовать = 1).

Я пробую это:

 $query = AppArticle;

$query->where(function($query)
  {
      $query->whereHas('category' , function ($query) {$query->where('publish' , true ); });
  });
 

Однако этот код работает только для текущей категории статей (не для родительской этой категории).

Позвольте мне объяснить больше на примере.

pulish в «новостях» значение false. ( pulish = 0 )

pulish в «политике» верно. ( pulish = 1 )

Теперь я хочу получить все статьи с помощью ( pulish=1 ) в своей категории. Приведенный выше код запроса возвращает мне ‘article2.’ Я не ожидаю, что мне вернут статью. Поскольку даже «политика» есть publish=1 , ее родительский элемент (новости) есть publish=0 , поэтому связанные статьи публиковать не следует. Как можно изменить код запроса для поддержки родительского элемента (или, тем более, его главных родителей)?