Как получить много записей из массива в laravel - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть массив категорий, и у этих категорий есть много книг (ownToMany), как я могу получить всю книгу

извините за мою модель категории Engli sh

class category_b extends Model
{
    protected $table = 'categoryb';
    protected $attributes = array(
        'lang'=> 'fa',
    );

  public function getBooks()
  {
      return $this->belongsToMany('App\book','categoryb_book');
  }

}

модель моей книги

class book extends Model
{



    public function getCategory()
    {
        return $this->belongsToMany('App\category_b','categoryb_book');
    }

}

мой код

$Category = $user->subscriptions(category_b::class)->pluck('id');
$bookCategory= category_b::whereIn('id',$Category)->get();
$bookCategory = $bookCategory->getBooks;

Ответы [ 2 ]

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

Как указал @Makdous, существуют различные подходы, вы можете выбрать тот, который соответствует вашим потребностям.

Обратите внимание, что подход l oop может привести к дублированию книг, поэтому после l oop вы придется удалить дубликаты записей.

Чтобы избежать этой проблемы, одним из решений будет прямой запрос модели книги:

$categoryIds = $user->subscriptions(category_b::class)->pluck('id');

$books = book::whereHas('getCategory', function ($q) use ($categoryIds) {
    return $q->whereIn('categoryb.id', $categoryIds);
})
->get();

РЕДАКТИРОВАТЬ:

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

В классе Book:

class book extends Model 
{
    // .....
    // .....


    // Somewhere in your Book class ...

    public function scopeOfCategories($query, $categoryIds = [])
    {
        return $query->whereHas('getCategory', function ($q) use 
            ($categoryIds) {
            return $q->whereIn('categoryb.id', $categoryIds);
        });
    }

}

Теперь вы можете заменить старый фрагмент кода со следующим:

$categoryIds = $user->subscriptions(category_b::class)->pluck('id');

$books = book::ofCategories($categoryIds)->get();
1 голос
/ 22 апреля 2020

Вы можете использовать foreach, как указано в документах , для перебора книг выбранной вами категории.

foreach ($bookCategory as $book) {
 //access book's attributes
}

Или аналогичным образом вы можете получить категории определенная книга.

$book = Book::find($id);
$categories = $book->getCategory();
foreach ($categories as $category) {
 //access category's attributes
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...