LiversonLiverson MemberComments: 69 Received thanks: 12 Member since: March 2013

Hallo,

versuche grade mittels eigener Condition Artikel zurück zu bekommen, die nicht aktiv sind. Leider klappt das nicht, da scheinbar in der Standard-Query schon auf active = 1 abgefragt wird. Wenn ich jetzt mit meiner Condition die Query erweitere um

...
$query->where('active = :active');
$query->setParameter(':active', 1);
...

erhalte ich die Fehlermeldung "Integrity constraint violation: 1052 Column 'active' in where clause is ambiguous'". Kann ich in dem Fall irgendwie die Abfrage auf active aus der Standardabfrage neutralisieren, damit meine Condition greift und alle Artikel auswirft, die nicht aktiv sind?

Danke und Gruss,
Oliver

Answers

  • brettvormkoppbrettvormkopp MemberComments: 1488 Received thanks: 308 edited July 2018 Member since: March 2013

    muss das nicht so lauten? : 

    $query->setParameter('active',1);

    EDIT: ggf auch so:

    $query->setParameter('active',true);

    ps: 0 = nicht aktiv, 1 = aktiv, true = aktiv ?

  • LiversonLiverson MemberComments: 69 Received thanks: 12 Member since: March 2013

    ich will ja in dem Fall alle Artikel ausgeben, die nicht aktiv sind, als active = false bzw. 0.

    Das scheint sich dann mit der Standard-Query zu beißen, weil dort scheinbar schon ein active = 1 in der where-clause integriert ist, denke ich. Es müsste also eine Möglichkeit geben, die Condition aus der Standard-Query erst mal zu entfernen. Aber wie? 

  • brettvormkoppbrettvormkopp MemberComments: 1488 Received thanks: 308 Member since: March 2013
    1. :active vs active
    2. hast du mehrere Tabellen in der Query? ggf brauchst du ->where('richtigetabelle.active = :active')
  • LiversonLiverson MemberComments: 69 Received thanks: 12 Member since: March 2013

    hab ich auch schon versucht ->where('s_articles.active = :active')

    Wenn ich das ganze z.B. auf 

    $query->where('name = :name')
    $query->setParameter(':name', 'irgendeinartikelname')

    setze kommt der abgefragte Artikel im Frontend raus. Wie gesagt, nur mit dem active gehts nicht, da wie ich vermute  in $query dann sowas entsteht WHERE active = 1 AND active = 0, was sich natürlich gegenseitig ausschließt und dann in einem "Integrity constraint violation: 1052 Column 'active' in where clause is ambiguous'" endet

  • brettvormkoppbrettvormkopp MemberComments: 1488 Received thanks: 308 Member since: March 2013

    poste bitte deine komplette query

  • LiversonLiverson MemberComments: 69 Received thanks: 12 edited July 2018 Member since: March 2013

     

    Anbei das gleiche was funktioniert und z.B. alle Artikel mit Namen Loremipsum ausgibt:

    namespace MyTestPlugin\Components\SearchBundleDBAL\Condition;
    
    use Shopware\Bundle\SearchBundle\ConditionInterface;
    use Shopware\Bundle\SearchBundleDBAL\ConditionHandlerInterface;
    use Shopware\Bundle\SearchBundleDBAL\QueryBuilder;
    use Shopware\Bundle\StoreFrontBundle\Struct;
    use Shopware\Bundle\StoreFrontBundle\Struct\ShopContextInterface;
    
    class MyActiveConditionHandler implements ConditionHandlerInterface
    {
        const ACTIVE_INCLUDED = 'my_active_included';
    
        /**
         * @inheritdoc
         */
        public function supportsCondition(ConditionInterface $condition)
        {
            return ($condition instanceof MyActiveCondition);
        }
    
        /**
         * @inheritdoc
         */
        public function generateCondition(
            ConditionInterface $condition,
            QueryBuilder $query,
            ShopContextInterface $context
        ) {
    
            if (!$query->hasState(self::ACTIVE_INCLUDED)) {
                $query->where('name = :name');
                $query->setParameter(':name', 'loremipsum');
                $query->addState(self::ACTIVE_INCLUDED);
            }
        }
    }

     

    Anbei der ConditionHandler, der den SQL-Fehler schmeisst:

    namespace MyTestPlugin\Components\SearchBundleDBAL\Condition;
    
    use Shopware\Bundle\SearchBundle\ConditionInterface;
    use Shopware\Bundle\SearchBundleDBAL\ConditionHandlerInterface;
    use Shopware\Bundle\SearchBundleDBAL\QueryBuilder;
    use Shopware\Bundle\StoreFrontBundle\Struct;
    use Shopware\Bundle\StoreFrontBundle\Struct\ShopContextInterface;
    
    class MyActiveConditionHandler implements ConditionHandlerInterface
    {
        const ACTIVE_INCLUDED = 'my_active_included';
    
        /**
         * @inheritdoc
         */
        public function supportsCondition(ConditionInterface $condition)
        {
            return ($condition instanceof MyActiveCondition);
        }
    
        /**
         * @inheritdoc
         */
        public function generateCondition(
            ConditionInterface $condition,
            QueryBuilder $query,
            ShopContextInterface $context
        ) {
    
            if (!$query->hasState(self::ACTIVE_INCLUDED)) {
                $query->where('active = :active');
                $query->setParameter(':active', 1);
                $query->addState(self::ACTIVE_INCLUDED);
            }
        }
    }

    Also eigener Condition-Handler funktioniert offensichtlich, nur halt nicht auf die benötigte Spalte active :(

  • brettvormkoppbrettvormkopp MemberComments: 1488 Received thanks: 308 Member since: March 2013

    ? Das Problem steht doch direkt vor der Nase?

  • LiversonLiverson MemberComments: 69 Received thanks: 12 Member since: March 2013

    sorry, aber im Moment nicht vor meiner ;)

Sign In or Register to comment.