Таблица Laravel PIVOT с дополнительными полями и withCount («таблица») не работает должным образом

У меня есть следующая структура в моей базе данных.

users
--
id
...

products
--
id
...

licenses (pivot table with some extra informations these data are grabbed via API)
--
user_id
product_id
license_key
license_type
url
purchased_at (datetime)
supported_until (datetime)
...

А вот коды в моей модели:

# User has many licenses
# User has many products through licenses
User
  // User has many licenses.
  public function licenses()
  {
    return $this->hasMany(License::class);
  }

Модель продукта.

# Product has many licenses
Product
  
  public function licenses()
  {
    return $this-hasMany(License::class);
  }

Модель лицензии

# License belongs to an user.
# License belongs to a product.
License

  public function user()
  {
    return $this->belongsTo(User::class);
  }
  
  public function product()
  {
    return $this->belongsTo(Product::class);
  }
  

Маршрут

// Эти пространства имен классов импортируются и применяются все необходимые промежуточные программы. Route::get('/my-products', [ProductController::class, 'index']);

И в контроллере продукта

ProductController

  public function index()
  {
    $user = Auth::user();
    

    
    $products = Product::whereHas('licenses', function (Builder $query) use($user) {
        $query->where('user_id', $user->id);
    })
    ->withCount(['licenses'])   // This is returning all the licenses for this product disrespecting the user.
    ->paginate(5);
                     
  }

Я не получаю никаких продуктов из отношения лицензий при использовании $user->products Мне нужно отобразить количество лицензий для этого продукта пользователя. Что я получаю: у продукта B всего 15 лицензий. Я получаю все лицензии для этого продукта. https://prnt.sc/xyokil


person Raajen    schedule 01.02.2021    source источник
comment
@м-халид-джунаид. Не могли бы вы помочь в этом   -  person Raajen    schedule 01.02.2021


Ответы (1)


Я считаю, что вы можете ввести метод закрытия для фильтрации для конкретного пользователя при загрузке связанных моделей как

$products = Product::whereHas('licenses', function (Builder $query) use($user) {
    $query->where('user_id', $user->id);
})
->withCount(['licenses' => function ($query) use ($user) {
    $query->where('user_id', $user->id);
}])   
->paginate(5);
person M Khalid Junaid    schedule 01.02.2021
comment
Просто еще раз спасибо. Это мой первый проект в Laravel, поэтому я могу задать много вопросов новичкам :) - person Raajen; 01.02.2021