العقيدة: كيفية إزالة جزء من جملة Where من Select Query Inside Beasher (profqlselect)؟

StackOverflow https://stackoverflow.com/questions/1567652

سؤال

المستمع الخاص بي هو جزء من سلوك ، من شأنه إزالة جميع الشيكات is_publised في جملة WHERE من أي استعلام SELECT. يعد إضافة جزء إلى جملة أمرًا سهلاً حقًا ، ولكن كيفية إزالة واحدة.

هناك بعض الوظائف مثل Doctrine_Query->removeDqlQueryPart('where'), ، لكن هذا يزيل البند الكامل ، بينما أحتاج فقط إلى 'is_published = ?' جزء ليتم إزالته.

ومع ذلك ، يمكنني التعامل مع هذا يدويًا بطريقة ما ، مع Regex أو شيء من هذا القبيل. لكن الجزء الصعب هو كيفية إزالة المعلمة التي يمثلها "؟" من صفيف المعلمات المقابلة (قابلة للاسترداد بواسطة Doctrine_Query->getRawParams()).

لذلك أسأل ، هل هناك طريقة نظيفة لتحويل هذا النوع من الاستعلام:
...FROM Video v WHERE v.is_published = ? AND v.start_date < ? AND v.end_date > ?

إلى هذا تجريد واحد ودون عبث المعلمات التي تمثلها علامات الاستفهام:
...FROM Video v WHERE v.start_date < ? AND v.end_date > ?

هذا بالطبع مجرد مثال بسيط ، استفساراتي أكثر تعقيدًا قليلاً. لسوء الحظ ، أنا عالق مع العقيدة 1.0.x بسبب إطار عمل Symfony.

هل كانت مفيدة؟

المحلول

الدعوة $query->getDqlPart('where') سيعود array من أجزاء الفقرة التي تمت إضافتها عبر where(), andWhere(), وظائف الخ. حتى تتمكن من استخدام ذلك للعثور على الجزء الذي تريده وإزالته.

ثم عليك التعامل مع المعلمات. أثناء ركوب الدراجات عبر الأجزاء التي ستحتاج إلى العثور عليها؟ وحسدهم وتذكر الأرقام لأي من الأرقام التي تقوم بإزالتها ثم اتصل $params = $query->getParams(); وستكون معلمات الفقرة في مكانها $params['where'] حتى تتمكن من إزالتها من هناك ثم الاتصال $query->setParams($params);

نصائح أخرى

إجابة جوشوا كودي مقرها

    $qb = <query builder>;
    $qb_where_part = $qb->getDqlPart('where')->getParts();
    $qb->resetDQLPart('where');
    // we know by dumping that it is an and operator in our case, generic way shoud take op in account
    //var_dump($qb->getDqlPart('where'));
    foreach ($qb_where_part as $where_clause) {
        if ('o.date > :date_debut' === $where_clause) continue;
        $qb->andWhere($where_clause);
    }
    $params = $qb->getParameters();
    $new_date_fin = null;
    foreach ($params as $key => $param) {
        if ($param->getName() === 'date_debut') {
            $new_date_fin = $param->getValue();
            $params->remove($key);
        }
        if ($param->getName() === 'date_fin' && $new_date_fin) {
            $param->setValue($new_date_fin);
            //var_dump($param->getValue());
        }
    }
    $qb->setParameters($params);
    var_dump($qb->getParameters());
    var_dump($qb->getDqlPart('where'));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top