@mrdragon9000

Как при получении всех экземпляров модели сразу загрузить, принадлежат ли они текущему пользователю?

Есть модель User и Product. Пользователи могут иметь много одинаковых продуктов(many to many), но каждый продукт не более одного раза.
Нужно в личном кабинете показать список всех имеющихся на сайте товаров, но если товар уже куплен данным пользователем, чтобы это было сразу указано.
Как сделать это максимально эффективно?
Вообщем подскажите альтернативу Product::all() , чтобы также грузились отметки, куплен ли товар текущим пользователем

Не очень хочется костылить и делать Product::all() и $user->products() , после чего сращивать результаты. Может можно обойтись без этого?)
  • Вопрос задан
  • 115 просмотров
Решения вопроса 1
@jazzus
если я правильно понял задачу, в модели User
public function getProductById($id)
{
  return $this->products()->find($id);
}
      
public function hasProduct($id)
{
    return $this->getProductById($id)->count()>0;
}

в котроллере
if ($user->hasProduct($product->id)) {
     // не продавать
}

шаблоне
@if ($user->hasProduct($product->id))
 <div class="danger">
      Вы уже купили этот товар
  </div>
@endif

нужно проверять то, что я написал
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
ShelestovAnt
@ShelestovAnt
Верстаю и программирую
Проверить негде, но может так сработает:
Product::with([
            'user' => function($query) {
                return $query->where('user_id', \Sentinel::getUser()->id);
            }
        ])->get();

Если user не пустое значит куплено текущим пользователем
Ответ написан
Комментировать
@procode
Разработчик
А почему костылить-то?

Получаете две коллекции, вычитаете одну из другой в цикле или еще как, и выводите в зависимости от.

Это самое простое решение.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы