Nano Hash - криптовалюты, майнинг, программирование

Модель репозитория Laravel, выполняющая два запроса

Я пытаюсь реализовать модель критериев на основе этого пакета.

Если я нажимаю следующие критерии, которые выполняют соединение и извлекают необходимые столбцы, предполагается, что он выполняет один запрос. Но он выполняет два запроса

select `products`.`product_name`, `skus`.`quantity` from `products` inner join `skus` on `skus`.`products_id` = `products`.`products_id` where `products`.`products_id` = '1'380μshomestead

select * from `products` where `products`.`products_id` = '0' limit 1

Почему он выполняет два запроса, а мне нужно выполнить только первый?

Примеры кода следующим образом

Контроллер

public function __construct(ProductRepository $product_repository){
        $this->product_repository = $product_repository;
    }

    public function all()
    {
        $data = $this->product_repository->getByCriteria(new GetProduct());
        $product = $this->product_repository->find('1');

    }

Репозиторий критериев

class getProduct implements CriteriaInterface {

    public function apply($model, RepositoryInterface $repository)
    {
        $model = $model
                ->select('products.product_name', 'skus.quantity')
                ->where('products.products_id', '1')
                ->join('skus', 'skus.products_id', '=', 'products.products_id');
        return $model; 
    }
}

dd($data) дал следующее

Collection {#300 ▼
  #items: array:2 [▼
    0 => Product {#301 ▼
      #primaryKey: "products_id"
      #fillable: []
      #connection: null
      #table: null
      #perPage: 15
      +incrementing: true
      +timestamps: true
      #attributes: array:2 [▶]
      #original: array:2 [▶]
      #relations: []
      #hidden: []
      #visible: []
      #appends: []
      #guarded: array:1 [▶]
      #dates: []
      #dateFormat: null
      #casts: []
      #touches: []
      #observables: []
      #with: []
      #morphClass: null
      +exists: true
      +wasRecentlyCreated: false
    }
    1 => Product {#302 ▼
      #primaryKey: "products_id"
      #fillable: []
      #connection: null
      #table: null
      #perPage: 15
      +incrementing: true
      +timestamps: true
      #attributes: array:2 [▶]
      #original: array:2 [▶]
      #relations: []
      #hidden: []
      #visible: []
      #appends: []
      #guarded: array:1 [▶]
      #dates: []
      #dateFormat: null
      #casts: []
      #touches: []
      #observables: []
      #with: []
      #morphClass: null
      +exists: true
      +wasRecentlyCreated: false
    }
  ]
}

  • Можете ли вы добавить dd($data) прямо перед $product, чтобы увидеть, что возвращается в $data ?? Кажется, что запрос que с критериями выполняется нормально, однако вы выполняете другой запрос с $this->product_repository->find('1'); 08.12.2015
  • Получил это «FatalErrorException в строке 24 ProductController.php: невозможно использовать возвращаемое значение функции в контексте записи», когда я помещаю dd 08.12.2015
  • Ну, это выполнение двух запросов, потому что вы делаете два запроса, это первый запрос $data = $this->product_repository->getByCriteria(new GetProduct()); и это ваш второй запрос $product = $this->product_repository->find('1');, если вы просто хотите, чтобы первый запрос удалил вторую строку 08.12.2015
  • ну, этого не должно быть. Вы должны получать результаты запроса из этого dd(). Вы объявили $fieldSearchable в своих моделях? Кроме того, если вы планируете добавить критерии, а затем выполнить второй запрос, используйте pushCriteria вместо getByCriteria. 08.12.2015
  • @cbcaio Извините, в dd, который я дал, была синтаксическая ошибка. Вот что я получил. Пожалуйста, проверьте обновленный Q. 08.12.2015

Ответы:


1

Что ж, думаю, у нас есть решение. Вы выполняете 2 запроса

Один здесь:

$data = $this->product_repository->getByCriteria(new GetProduct());

относительно :

select `products`.`product_name`, `skus`.`quantity` from `products` inner join `skus` on `skus`.`products_id` = `products`.`products_id` where `products`.`products_id` = '1'

и еще один здесь

$product = $this->product_repository->find('1');

относительно:

select * from `products` where `products`.`products_id` = '0' limit 1

Если вы планировали использовать критерии, а затем выполнить запрос, измените getByCriteria на pushCriteria, как показано ниже.

$data = $this->product_repository->pushCriteria(new GetProduct());

Делая это, вы сообщаете своему репозиторию, что хотите, чтобы все запросы соответствовали тому, что было указано в этих критериях, поэтому все ваши следующие запросы будут использовать эти критерии. Итак, когда вы сделаете $product = $this->product_repository->find('1');, вы на самом деле получите

->select('products.product_name', 'skus.quantity')
->where('products.products_id', '1')
->join('skus', 'skus.products_id', '=', 'products.products_id')
->find('1');

Надеюсь, я помог, и теперь понятно, почему вы получаете 2 запроса из этого кода.

08.12.2015
  • Я рад, что помог :) 08.12.2015
  • Еще одно уточнение, которое я требую от вас. Могу ли я передать нужные мне столбцы из контроллера? Любой способ сделать это? 08.12.2015
  • Что ты имеешь в виду? Разве вы не делали этого, когда использовали ->select('products.product_name', 'skus.quantity') ? 08.12.2015
  • но это было жестко запрограммировано в критериях. Что делать, если мне нужно динамически передавать имена столбцов из контроллера? 08.12.2015
  • ну... я просто придумал способ, но, возможно, это неправильный подход. В вашем классе GetProduct укажите в конструкторе массив строк, что-то вроде public function __construct($string){ $this->columns = $string; }, затем измените критерии, чтобы добавить эти строки в качестве столбцов при выборе. Когда вы используете свои критерии в контроллере, просто используйте pushCriteria(new GetProduct(['column1', 'column2'])); , это может сработать 08.12.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..