THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline


Bonjour,

Pour notre marketplace, j'ai réussi à créer des factures liées à des vendeur liés via une table liaison.
J'ai créée une nouvelle Loop pour voir les commande lié à un vendeur et elle marche. Maintenant, j'aimerais afficher les factures "générales", soit les factures complètes avec tous les produits. Ce sont celles qui ne sont pas liées à un vendeur.

J'ai tenté :
ArtabanMarketplace\Loop\AmpSellerOrderLoop.php

public function buildModelCriteria() {
        $query = parent::buildModelCriteria();



        if (null != $id = $this->getAmpSellerId()) {

            if (is_array($id)) {
                $id = implode(",", $id);
            }
            if ($id == 0) {

                $ampSellerJoin = new Select(OrderTableMap::ID, AmpSellerOrderTableMap::ORDER_ID, Criteria::LEFT_OUTER_JOIN);
                $query
                        ->addJoinObject($ampSellerJoin, "ampSellerJoin")
                        ->where(AmpSellerOrderTableMap::AMP_SELLER_ID . " " . Criteria::GREATER_THAN . "0");
            } else {

                $ampSellerJoin = new Join(OrderTableMap::ID, AmpSellerOrderTableMap::ORDER_ID, Criteria::LEFT_JOIN);
                $query
                        ->addJoinObject($ampSellerJoin, "ampSellerJoin")
                        ->where(AmpSellerOrderTableMap::AMP_SELLER_ID . " " . Criteria::IN . " (" . $id . ")");
            }
        }

        return $query;
    }

Mais il semblerait que LEFT_OUTER_JOIN ne soit pas reconnu par Propel.

FatalThrowableError in AmpSellerOrderLoop.php line 53:
Fatal error: Undefined class constant 'LEFT_OUTER_JOIN'

J'avoue ne pas trop savoir comment faire pour contourner ce problème.

Est ce que quelqu'un aurait une idée ?

Merci d'avance.

Offline


En gros, tu veux faire un select * from order where id not in (select order_id from amp_seller_order) ?


OpenStudio Toulouse

Offline


Oui, c'est c'est ça j'ai posé la question sur stackoverflow. Je vais voir si il y a une réponse...
[Edit]
Pas encore de réponse...

Last edited by GillesL (27-06-2018 14:41:17)

Offline


J'ai essayé un truc :

                $subquery = OrderQuery::create();
                $ampSellerJoin = new Join(OrderTableMap::ID, AmpSellerOrderTableMap::ORDER_ID, Criteria::LEFT_JOIN);
                $subquery->select('*')
                        ->addJoinObject($ampSellerJoin, "ampSellerJoin")
                        ->where(AmpSellerOrderTableMap::AMP_SELLER_ID . " " . Criteria::GREATER_THAN . " (0)");            
                               
                $query->addSelectQuery($subquery);

mais j'obtiens cette erreur :

Unable to execute SELECT statement [SELECT alias_1.ID, alias_1.REF, alias_1.CUSTOMER_ID, alias_1.INVOICE_ORDER_ADDRESS_ID, alias_1.DELIVERY_ORDER_ADDRESS_ID, alias_1.INVOICE_DATE, alias_1.CURRENCY_ID, alias_1.CURRENCY_RATE, alias_1.TRANSACTION_REF, alias_1.DELIVERY_REF, alias_1.INVOICE_REF, alias_1.DISCOUNT, alias_1.POSTAGE, alias_1.POSTAGE_TAX, alias_1.POSTAGE_TAX_RULE_TITLE, alias_1.PAYMENT_MODULE_ID, alias_1.DELIVERY_MODULE_ID, alias_1.STATUS_ID, alias_1.LANG_ID, alias_1.CART_ID, alias_1.CREATED_AT, alias_1.UPDATED_AT, alias_1.VERSION, alias_1.VERSION_CREATED_AT, alias_1.VERSION_CREATED_BY FROM (SELECT order.ID, order.REF, order.CUSTOMER_ID, order.INVOICE_ORDER_ADDRESS_ID, order.DELIVERY_ORDER_ADDRESS_ID, order.INVOICE_DATE, order.CURRENCY_ID, order.CURRENCY_RATE, order.TRANSACTION_REF, order.DELIVERY_REF, order.INVOICE_REF, order.DISCOUNT, order.POSTAGE, order.POSTAGE_TAX, order.POSTAGE_TAX_RULE_TITLE, order.PAYMENT_MODULE_ID, order.DELIVERY_MODULE_ID, order.STATUS_ID, order.LANG_ID, order.CART_ID, order.CREATED_AT, order.UPDATED_AT, order.VERSION, order.VERSION_CREATED_AT, order.VERSION_CREATED_BY FROM `order` LEFT JOIN `amp_seller_order` ON (order.ID=amp_seller_order.ORDER_ID) WHERE amp_seller_order.AMP_SELLER_ID > (0)) AS alias_1 ORDER BY order.CREATED_AT DESC LIMIT 20]

Est ce que ça vous parle ?

Offline


Essaie un truc du genre :

OrderQuery::create()->where(OrderTableMap::ID . " NOT IN (SELECT ".AmpSellerOrderTableMap::ORDER_ID." FROM ".AmpSellerOrderTableMap::TABLE_NAME." WHERE ".AmpSellerOrderTableMap::AMP_SELLER_ID." > 0)");

OpenStudio Toulouse

Offline


Merci de ta réponse Roaster.

Voilà ce que j'ai mis en me basant sur ta proposition

$query->where(OrderTableMap::ID . " NOT IN (SELECT ".AmpSellerOrderTableMap::ORDER_ID." FROM ".AmpSellerOrderTableMap::TABLE_NAME.")");