Проблема при реализации SQL в построителе запросов - PullRequest
0 голосов
/ 07 апреля 2020

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

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

вот оригинальная организация:

файл контроллера поиска:

`public function searchAction(Request $request)
{
//For drag map mode
$isXmlHttpRequest = $request->isXmlHttpRequest() ? true : false;

$markers = array('listingsIds' => array(), 'markers' => array());
$listings = new \ArrayIterator();
$nbListings = 0;

/** @var ListingSearchRequest $listingSearchRequest */
$listingSearchRequest = $this->get('cocorico.listing_search_request');
$isXmlHttpRequest ? $listingSearchRequest->setSortBy('distance') : null;
$form = $this->createSearchResultForm($listingSearchRequest);

$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
    $listingSearchRequest = $form->getData();

    **$results = $this->get("cocorico.listing_search.manager")->search(
        $listingSearchRequest,
        $request->getLocale()
    );
    $nbListings = $results->count();
    $listings = $results->getIterator();
    $markers = $this->getMarkers($request, $results, $listings);**

    //Persist similar listings id
    $listingSearchRequest->setSimilarListings($markers['listingsIds']);

    //Persist listing search request in session
    !$isXmlHttpRequest ? $this->get('session')->set('listing_search_request', $listingSearchRequest) : null;
} else {
    foreach ($form->getErrors(true) as $error) {
        $this->get('session')->getFlashBag()->add(
            'error',
            /** @Ignore */
            $this->get('translator')->trans($error->getMessage(), $error->getMessageParameters(), 'cocorico')
        );
    }
}`

- файл поискового менеджера

`public function searchAction(Request $request)
{
//For drag map mode
$isXmlHttpRequest = $request->isXmlHttpRequest() ? true : false;

$markers = array('listingsIds' => array(), 'markers' => array());
$listings = new \ArrayIterator();
$nbListings = 0;

/** @var ListingSearchRequest $listingSearchRequest */
$listingSearchRequest = $this->get('cocorico.listing_search_request');
$isXmlHttpRequest ? $listingSearchRequest->setSortBy('distance') : null;
$form = $this->createSearchResultForm($listingSearchRequest);

$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
    $listingSearchRequest = $form->getData();

    $results = $this->get("cocorico.listing_search.manager")->search(
        $listingSearchRequest,
        $request->getLocale()
    );
    $nbListings = $results->count();
    $listings = $results->getIterator();
    $markers = $this->getMarkers($request, $results, $listings);

    //Persist similar listings id
    $listingSearchRequest->setSimilarListings($markers['listingsIds']);

    //Persist listing search request in session
    !$isXmlHttpRequest ? $this->get('session')->set('listing_search_request', $listingSearchRequest) : null;
} else {
    foreach ($form->getErrors(true) as $error) {
        $this->get('session')->getFlashBag()->add(
            'error',
            /** @Ignore */
            $this->get('translator')->trans($error->getMessage(), $error->getMessageParameters(), 'cocorico')
        );
    }
}`

и файл репозитория

class ListingRepository extends EntityRepository
{
/**
 *
 * @return \Doctrine\ORM\QueryBuilder
 */
public function getFindQueryBuilder()
{
    $queryBuilder = $this->_em->createQueryBuilder()
        //Select
        ->select("partial l.{id, price, averageRating, certified, createdAt, commentCount}")
        ->addSelect("partial t.{id, locale, slug, title, description}")
        ->addSelect("partial llcat.{id, listing, category}")
        ->addSelect("partial ca.{id, lft, lvl, rgt, root}")
        ->addSelect("partial cat.{id, locale, name}")
        ->addSelect("partial i.{id, name}")
        ->addSelect("partial u.{id, firstName}")
        //->addSelect("partial ln.{id}")
        ->addSelect("partial ln.{id, city, route, country}")
        ->addSelect("partial co.{id, lat, lng}")
        ->addSelect("partial ui.{id, name}")
        ->addSelect("'' AS DUMMY")//To maintain fields on same array level when extra fields are added

        //From
        ->from('CocoricoCoreBundle:Listing', 'l')
        ->leftJoin('l.translations', 't')
        ->leftJoin('l.listingListingCategories', 'llcat')
        ->leftJoin('llcat.category', 'ca')
        //Join::WITH: Avoid exclusion of listings with no categories (disable inner join)
        ->leftJoin('ca.translations', 'cat', Query\Expr\Join::WITH, 'cat.locale = :locale')
        ->leftJoin('l.images', 'i')
        ->leftJoin('l.user', 'u')
        ->leftJoin('u.images', 'ui', Query\Expr\Join::WITH, 'ui.position = 1')
        ->leftJoin('l.location', 'ln')
        ->leftJoin('ln.coordinate', 'co');

        // $queryBuilder
        //->addGroupBy('l.id');

    return $queryBuilder;

My SQL выглядит так:

SQL query

Так что в принципе я думаю, что я должен добавить group_concat left присоединяйся и группируйся в списке выбора репозитория, а затем добавляй условие «везде» с внедренными категориями var, чтобы получить мой результат ....

Однако я много пробовал, но не могу этого сделать ... Может кто-нибудь пытается дать мне подсказку, чтобы я мог фини sh?

1 Ответ

0 голосов
/ 07 апреля 2020

До сих пор я пробовал это в репозитории листинга:

    $queryBuilder = $this->_em->createQueryBuilder()
        //Select
        ->select("partial l.{id, price, averageRating, certified, createdAt, commentCount}")
        ->addSelect("partial t.{id, locale, slug, title, description}")
        ->addSelect("partial llcat.{id, listing, category}")
        ->addSelect("partial ca.{id, lft, lvl, rgt, root}")
        ->addSelect("partial cat.{id, locale, name}")
        ->addSelect("partial i.{id, name}")
        ->addSelect("partial u.{id, firstName}")
        //->addSelect("partial ln.{id}")
        ->addSelect("partial ln.{id, city, route, country}")
        ->addSelect("partial co.{id, lat, lng}")
        ->addSelect("partial ui.{id, name}")
        ->addselect("Group_Concat(llcatbis.listingcategoryid SEPARATOR ',') AS allcat")


        //From
        ->from('CocoricoCoreBundle:Listing', 'l')
        ->leftJoin('l.translations', 't')
        ->leftjoin('l.listingListingCategories', 'llcat')
        ->leftjoin('l.listingListingCategories', 'llcatbis')
        ->leftJoin('llcat.category', 'ca')
        //Join::WITH: Avoid exclusion of listings with no categories (disable inner join)
        ->leftJoin('ca.translations', 'cat', Query\Expr\Join::WITH, 'cat.locale = :locale')
        ->leftJoin('l.images', 'i')
        ->leftJoin('l.user', 'u')
        ->leftJoin('u.images', 'ui', Query\Expr\Join::WITH, 'ui.position = 1')
        ->leftJoin('l.location', 'ln')
        ->leftJoin('ln.coordinate', 'co');
        //->leftJoin('co.country', 'cy');

    $queryBuilder
        ->addGroupBy('llcat.id');

    return $queryBuilder;

, но когда я добавляю, чтобы попробовать это в поисковике:

$categories = $listingSearchRequest->getCategories();
    if (count($categories)) {
        $queryBuilder
          ->andWhere('llcat.category IN (:categories)')
          ->andWhere('allcat = 2')
            ->setParameter('categories', $categories);

У меня есть следующая ошибка как allcat не определено:

An exception occurred while executing 'SELECT COUNT(*) AS dctrn_count FROM (SELECT GROUP_CONCAT(l0_.listing_category_id SEPARATOR ',') AS sclr_0, ((ACOS(SIN(? * 0.0174532925) * SIN(g1_.lat * 0.0174532925 ) + COS(? * 0.0174532925) * COS(g1_.lat * 0.0174532925) * COS((? - g1_.lng) * 0.0174532925)) * 57.2957795131) * 111.18957696) AS sclr_1, l2_.id AS id_2, l2_.price AS price_3, l2_.certified AS certified_4, l2_.average_rating AS average_rating_5, l2_.comment_count AS comment_count_6, l2_.createdAt AS createdAt_7, l3_.title AS title_8, l3_.description AS description_9, l3_.locale AS locale_10, l3_.id AS id_11, l3_.slug AS slug_12, l4_.id AS id_13, l5_.id AS id_14, l5_.lft AS lft_15, l5_.lvl AS lvl_16, l5_.rgt AS rgt_17, l5_.root AS root_18, l6_.name AS name_19, l6_.locale AS locale_20, l6_.id AS id_21, l7_.id AS id_22, l7_.name AS name_23, u8_.id AS id_24, u8_.first_name AS first_name_25, u9_.id AS id_26, u9_.name AS name_27, l10_.id AS id_28, l10_.country AS country_29, l10_.city AS city_30, l10_.route AS route_31, g1_.id AS id_32, g1_.lat AS lat_33, g1_.lng AS lng_34 FROM listing l2_ LEFT JOIN listing_translation l3_ ON l2_.id = l3_.translatable_id LEFT JOIN listing_listing_category l4_ ON l2_.id = l4_.listing_id LEFT JOIN listing_listing_category l0_ ON l2_.id = l0_.listing_id LEFT JOIN listing_category l5_ ON l4_.listing_category_id = l5_.id LEFT JOIN listing_category_translation l6_ ON l5_.id = l6_.translatable_id AND (l6_.locale = ?) LEFT JOIN listing_image l7_ ON l2_.id = l7_.listing_id LEFT JOIN `user` u8_ ON l2_.user_id = u8_.id LEFT JOIN user_image u9_ ON u8_.id = u9_.user_id AND (u9_.position = 1) LEFT JOIN listing_location l10_ ON l2_.location_id = l10_.id LEFT JOIN geo_coordinate g1_ ON l10_.coordinate_id = g1_.id WHERE g1_.lat < ? AND g1_.lat > ? AND g1_.lng < ? AND g1_.lng > ? AND l3_.locale = ? AND l2_.status = ? AND (l2_.price BETWEEN ? AND ?) AND l4_.listing_category_id IN (?, ?, ?, ?) AND sclr_0 = 2 GROUP BY l4_.id ORDER BY sclr_1 ASC, l2_.average_rating DESC, l2_.admin_notation DESC, l7_.position asc, u9_.position asc) dctrn_table' with params ["46.227638", "46.227638", "2.213749", "fr", 51.1241999, 41.31433, 9.6624999, -5.5591, "fr", 2, "100", "100000", "2", "3", "6", "7"]:

  SQLSTATE[42S22]: Column not found: 1054 Unknown column 'sclr_0' in 'where clause'
...