Перечислите все предметы и выделите те, которые находятся в данной категории - PullRequest
2 голосов
/ 09 апреля 2019

Итак ... Я получил эти две красноречивые модели и сводную таблицу:

## Categories ##
- ID
- title
belongsToMany(Items)

## Items ##
- ID
- title
belongsToMany(Categories)

## Items_Categories ##
- items ID
- categories ID

Мне нужен список ВСЕХ предметов и выделите те, которые находятся в данной категории.

# Example #

## Categorie #1 ##
- Item #1 (is in category)
- Item #2 
- Item #3 (is in category)
- Item #4 (is in category)
- Item #5

## Category #2 ##
- Item #1 (is in category)
- Item #2 
- Item #3
- Item #4 (is in category)
- Item #5

Мне казалось, что я делал это сто раз в прошлом, но я не могу понять, как это настроить. : - (

Если есть лучшее решение по настройке этих моделей / отношений, я играю.

// Get a single category with containing items
$category = Catgegory::whereNull('is_deleted')
    ->where('id', 1)
    ->with('items')
    ->first();

// Get all items
$allItems = Item::whereNull('is_deleted')
    ->get();


// Now what?
foreach ($allItems as $item) {
    // Compare with category items?!
}

1 Ответ

2 голосов
/ 09 апреля 2019

Вы можете добавить метод в модель элементов, чтобы проверить, равна ли категория элементов этой категории или нет. так что вы можете проверить это так:

Метод в модели элементов, который проверяет идентификатор категории:

  public function isInCategory($category_id){

      //get all $category_ids
      $category_ids = $this->categories()->pluck('id')->toArray();

     //check if $category_id exists in $category_ids array
      if(is_array($category_ids) && in_array($category_id,$category_ids))
          return true;

      return false;

    }

Или вы можете сделать это с помощью этого метода

 public function isInCategory($category_id){

   return $this->categories->contains($category_id);
}

Оба метода работают нормально. Но не забудьте написать этот метод в Элемент модели .

Так что вы можете использовать его в своем коде так:

// Get a single category with containing items
$category = Catgegory::whereNull('is_deleted')
    ->where('id', 1)
    ->with('items')
    ->first();

// Get all items
$allItems = Item::whereNull('is_deleted')
    ->get();


// check the category id
foreach ($allItems as $item) {
    $item->isInCategory($category->id) // returns true or false
}
...