Как получить продукты на основе подсчета на поле в этой таблице с Laravel - PullRequest
2 голосов
/ 09 июня 2019

Я работаю над Laravel 5.8

Допустим, у нас есть таблица таких продуктов:

id | product_type_id | ...

1 | ______ 1 _______ | ...

2 | ______ 2 _______ | ...

3 | ______ 2 _______ | ...

4 | ______ 3 _______ | ...

Я хотел бы знать, как получить все продукты, которые «разделяют» тип продукта.

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

Я знаю, кто должен делать это в цикле foreach, но я хотел бы воспользоваться ресурсами использования Laravel.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 09 июня 2019

Если я правильно понимаю ваш вопрос, вы могли бы сделать что-то подобное.

Сначала убедитесь, что в вашей модели ProductType определено отношение продуктов. (я полагаю, что это зависит от вашей таблицы продуктов.)

Затем вы можете выполнить запрос на основе подсчета отношений, используя метод модели Eloquent has.

Пример:

ProductType::with('products')->has('products', '>', 1)->get();

with('products') является необязательным.Он просто захватывает продукты одновременно, чтобы избежать дополнительных запросов.Метод whereHas также работает, но он действительно необходим, только если вам нужно отфильтровать отношения по более сложным параметрам.

Вы также можете использовать метод has / whereHas внутри модели Productиспользуя обратное отношение (то есть ownTo) , чтобы получить то же самое, но инвертированное.Это действительно зависит от того, как вы хотите, чтобы данные были представлены вам.

Пример:

Product::whereIn(
    'product_type_id',
    ProductType::has('products', '>', 1)->pluck('id')
)->get();

Подводя итог всему, первый способ даст вам:

ProductType => Product

В то время как второй пример даст вам:

Product => ProductType

Подробнее см. Соответствующую документацию Laravel .

Надеюсь, чтопомогает!

0 голосов
/ 09 июня 2019

Laravel может сделать это, используя отношения Eloquent вместе с has() и whereHas(), например:

$products = Product::whereHas('type', function ($builder) {
    $builder->whereKey(Type::has('products', '>=', 2)->pluck('id'));
})->get();

Я предполагаю, что вы определили Product и Typeмодели и соединили их вместе:

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