THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

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

Offline

#1 trier par...

(08-09-2015 09:44:10)


Bonjour,

Désolé mais je débute
j'essaie d'apprendre en faisant, pas évidant...

je me retrouve avec ce problème
j'ai une table avec un champ Country_id
je voudrais faire une loop avec un tri sur Country
un tri par le champ title de la table country_i18n

je ne vois pas comment écrire le search (surtout que je n'ai que la valeur Country_id)

case "country":
  $search->orderBy(CountryI18nTableMap::ID, Criteria::ASC);
  break;

je suis perdu sad


je me suis mal exprimé
j’essaie de faire un module comportant plusieurs table
une table TEST avec les champs (id, adresse_id....)
une table TEST_address avec les champs (id, address1,...,country_id)

dans ma loop TEST je voudrais trier par pays (le champ title de la table country_i18n) suivant la langue en cours
j'espère que j'ai bien expliqué

Last edited by Debutant (08-09-2015 10:04:48)

Offline

#2 Re: trier par...

(08-09-2015 10:38:33)


je ne souhaite pas la solution, mais la logique comment procéder pour comprendre

Merci

Offline

#3 Re: trier par...

(08-09-2015 10:53:21)


je pensais utiliser leftJoinTestAddress()
mais je ne vois pas comment écrire la relation

Offline

#4 Re: trier par...

(08-09-2015 12:06:03)


en SQL cela devrait donner cela :

SELECT * FROM `test` AS A LEFT JOIN `test_address` AS B ON (A.address_id = B.id) LEFT JOIN `country` AS C ON (B.country_id = C.id) LEFT JOIN `country_i18n` AS D ON (C.id = D.id AND D.locale = 'fr_FR') ORDER BY D.title

si je ne me trompe pas
mais comment l’écrire ?

Offline

#5 Re: trier par...

(08-09-2015 13:52:45)


bon personne ??

j'ai fais ça

$locale = $this->request->getSession()->getLang()->getLocale();
$search->leftJointestAddress('tabletestaddress')
                        ->addJoinCondition('tabletestaddress', 'tabletestaddress.ID=?',testTableMap::ADDRESS_ID,null, \PDO::PARAM_INT)
                        ->leftJoinCountry('tablecountry')
                        ->addJoinCondition('tablecountry', 'tablecountry.ID=?', 'tabletestaddress.COUNTRY_ID',null, \PDO::PARAM_INT)
                        ->leftJoinCountryI18n('tablecountryi18n')
                        ->addJoinCondition('tablecountryi18n', 'tablecountryi18n.ID=?', 'tablecountry.ID',null, \PDO::PARAM_INT)
                        ->addJoinCondition('tablecountryi18n', 'tablecountryi18n.LOCALE=?', $locale, null, \PDO::PARAM_STR)
                        ->orderBy('tablecountryi18n.TITLE', Criteria::ASC);

vous en pensez quoi ?? je suis vers la bonne piste ?

Offline

#6 Re: trier par...

(08-09-2015 14:54:05)


bon j'ai cette erreur

FatalErrorException in TestCallTableMap.php line 91: Parse Error: syntax error, unexpected 'FUNCTION' (T_FUNCTION), expecting identifier (T_STRING)

dès que ça passe à la 1er ligne ->addJoinCondition

Merci !

PS: c'est aà la ligne leftJoinDistributionnetworkAddress que l'erreur se produit

Personne pour aider un Débutant ??? sad

Last edited by Debutant (08-09-2015 15:42:36)

Offline

#7 Re: trier par...

(08-09-2015 16:58:31)


Cette dernière erreur semble due à une erreur de frappe, testTableMap devrait probablement être TestTableMap ?

Pour ce qui est de l'internationalisation dans les boucles, il existe la classe abstraite BaseI18nLoop qui contient des fonctions pour la gérer. La méthode configureI18nProcessing permet de réaliser une jointure avec les tables i18n. Les colonnes sont alors disponibles sous le nom i18n_TITLE par exemple.

Voir par exemple la loop product qui propose un tri sur le titre du produit, en faisant une jointure puis en ordonnant les résultats (dans ce cas c'est sur sa propre table i18n, mais il me semble qu'il est possible de spécifier la table étrangère).

Offline

#8 Re: trier par...

(09-09-2015 07:30:50)


Merci BCBRR
je vais regarder pour l'erreur et je vais étudier les liens
je posterai ce que j'ai compris smile

Offline

#9 Re: trier par...

(10-09-2015 12:51:33)


Debutant wrote:
FatalErrorException in TestCallTableMap.php line 91: Parse Error: syntax error, unexpected 'FUNCTION' (T_FUNCTION), expecting identifier (T_STRING)

l'erreur venait du nom d'un champ
j'avais nommé un champ 'function' cela posait problème du coup

pour le moment je n'arrive pas à jointer les tables
test et test_address

lorsque je fais

$search = TestQuery::create();
$search->rightJoinTestAddress('tabletestaddress')

dans la requête générée je n'ai que les champs de la table test
est ce normal ? je ne devrais pas me retrouver avec les champs de la table test et test_address
de ce fait

$this->configureI18nProcessing(
   $search,
    array('TITLE', 'CHAPO', 'DESCRIPTION', 'POSTSCRIPTUM'),
    CountryTableMap::TABLE_NAME,
   'COUNTRY_ID'
);

ne fonctionne pas, vu que le champ COUNTRY_ID est dans la table test_address

si j'ai bien compris
Merci d'avance pour votre aide

Last edited by Debutant (10-09-2015 12:53:36)

Offline

#10 Re: trier par...

(10-09-2015 13:50:45)


j'en suis ici

$search = TestQuery::create();
$search ->leftJoinTestAddress('tabletestaddress')
$this->configureI18nProcessing(
     $search,
     array('TITLE', 'CHAPO', 'DESCRIPTION', 'POSTSCRIPTUM'),
     CountryTableMap::TABLE_NAME,
    'COUNTRY_ID'
);

j'ai l'erreur suivante

PDOException in StatementWrapper.php line 196: SQLSTATE[42S22]: Column not found: 1054 Champ 'test.COUNTRY_ID' inconnu dans on clause

l'erreur est normale vu que le champ COUNTRY_ID est dans la table test_address
le leftJoinTestAddress ne devrait il pas me joindre ce champ ??

Offline

#11 Re: trier par...

(10-09-2015 14:52:53)


Il faudrait que tu regardes la requête générée. Tu la trouveras dans le fichier de log, si tu es en dev (avec index_dev.php).


OpenStudio Toulouse

Offline

#12 Re: trier par...

(10-09-2015 15:41:51)


dans les logs je ne trouve pas la requête seulement le message d'erreur

SQLSTATE[42S22]: Column not found: 1054 Champ 'test.COUNTRY_ID' inconnu dans on clause

mais il m'affiche sur la page la 2ieme erreur avec la requete suivante

PropelException in Criteria.php line 2442: Unable to execute SELECT statement 
[SELECT test.ID, test.VISIBLE, test.POSITION, test.TITLE, test.ADDRESS_ID, test.CALL_ID, test.EMAIL_ID, test.WEBSITE_ID, test.CREATED_AT, test.UPDATED_AT, test.VERSION, test.VERSION_CREATED_AT, test.VERSION_CREATED_BY, NOT ISNULL(`country_requested_locale_i18n`.`ID`) AS country_IS_TRANSLATED, CASE WHEN NOT ISNULL(`country_requested_locale_i18n`.ID) THEN `country_requested_locale_i18n`.`TITLE` ELSE `country_default_locale_i18n`.`TITLE` END AS country_i18n_TITLE, CASE WHEN NOT ISNULL(`country_requested_locale_i18n`.ID) THEN `country_requested_locale_i18n`.`CHAPO` ELSE `country_default_locale_i18n`.`CHAPO` END AS country_i18n_CHAPO, CASE WHEN NOT ISNULL(`country_requested_locale_i18n`.ID) THEN `country_requested_locale_i18n`.`DESCRIPTION` ELSE `country_default_locale_i18n`.`DESCRIPTION` END AS country_i18n_DESCRIPTION, CASE WHEN NOT ISNULL(`country_requested_locale_i18n`.ID) THEN `country_requested_locale_i18n`.`POSTSCRIPTUM` ELSE `country_default_locale_i18n`.`POSTSCRIPTUM` END AS country_i18n_POSTSCRIPTUM FROM `test` LEFT JOIN `test_address` ON (test.ADDRESS_ID=test_address.ID) LEFT JOIN `country` ON (test_address.COUNTRY_ID=country.ID) LEFT JOIN `country_i18n` `country_default_locale_i18n` ON (test.COUNTRY_ID=country_default_locale_i18n.ID AND `country_default_locale_i18n`.LOCALE = :p1) LEFT JOIN `country_i18n` `country_requested_locale_i18n` ON (test.COUNTRY_ID=country_requested_locale_i18n.ID AND `country_requested_locale_i18n`.LOCALE = :p2) WHERE test.VISIBLE=:p3 AND (NOT ISNULL(`country_requested_locale_i18n`.ID) OR NOT ISNULL(`country_default_locale_i18n`.ID)) LIMIT 2147483647]

il faudrait qu'il y ait SELECT *  non ?
je n'ai que les champs de la 1er table

Last edited by Debutant (10-09-2015 16:13:36)

Offline

#13 Re: trier par...

(10-09-2015 16:07:42)


avec Phpstorm pas à pas
c'est quand il passe

                    $this->configureI18nProcessing(
                        $search,
                        array('TITLE', 'CHAPO', 'DESCRIPTION', 'POSTSCRIPTUM'),
                        CountryTableMap::TABLE_NAME,
                        'COUNTRY_ID'
                    );

que selectColumns se remplit des 13 valeurs

Offline

#14 Re: trier par...

(10-09-2015 21:53:20)


Ton problème est là :

LEFT JOIN `country_i18n` `country_default_locale_i18n` ON (test.COUNTRY_ID=country_default_locale_i18n.ID AND ...

test.COUNTRY_ID n'est effectivement pas une colonne de country_i18n.

BaseI18nLoop::configureI18nProcessing() ne fonctionne pas avec une table i18n qui n'est pas celle associée à la table référencée par $search, ('test' dans ton cas). Voir pourquoi en ligne 54 de ModelCriteriaTools.php, par exemple, ou le "leftTableName" est $search->getTableMap()->getName().

Donc tu ne peux pas réaliser la jointure de 'country_i18n' avec 'test' en utilisant BaseI18nLoop::configureI18nProcessing().

Tu ne peux pas non plus t'appuyer sur le behavior i18n de Propel, puisqu'il n'existe pas de relation directe entre 'test' et 'country_i18n'.

Tu pourrais par contre déclarer test.country_id comme une foreign key vers country_i18n dans ton schema.xml, et utiliser les méthodes générées pour réaliser ton tri.

Ça me parait plus simple et plus clean que de construire la requête à la main.


OpenStudio Toulouse

Offline

#15 Re: trier par...

(11-09-2015 07:56:52)


Merci ROADSTER31

cela me paraissais plus logique de mettre country_id dans la table test_address
et si je change par:
si order='country'
$search référené à test_address
et avec un LEFT JOIN avec la table test

possible ? mais cela va me renvoyer les champs de la table test ?

Offline

#16 Re: trier par...

(11-09-2015 08:13:30)


ce que je ne comprends pas
comment faire pour que le SELECT me retourne les champs que j'ai besoin pas que seulement ceux de la table référencée

Offline

#17 Re: trier par...

(11-09-2015 08:41:14)


Ha oui, test_address, pas test. Donc ce que je suggère, c'est de déclarer test_address.country_id comme une foreign key vers country_i18n dans ton schema.xml,

Une fois que tu auras ré-généré ton modèle, tu auras dans la classe TestAddressQuery des méthodes pour manipuler la table country_i18n, cf. la doc Proel : http://propelorm.org/documentation/04-r … ships.html


OpenStudio Toulouse

Offline

#18 Re: trier par...

(11-09-2015 09:48:29)


mais j'ai deja

    <table name="test" namespace="test\Model">
        <column autoIncrement="true" name="id" primaryKey="true" required="true" type="INTEGER" />
        <column defaultValue="0" name="visible" required="true" type="TINYINT" />
        <column defaultValue="0" name="position" required="true" type="INTEGER" />
        <column name="title" size="255" type="VARCHAR" />
        <column name="address_id" type="INTEGER" />
         .....
        <foreign-key foreignTable="test_address" name="fk_test_address_id" onDelete="CASCADE" onUpdate="RESTRICT">
            <reference foreign="id" local="address_id" />
        </foreign-key>
        <index name="idx_test_address_id">
            <index-column name="address_id" />
        </index>
        <behavior name="timestampable" />
        <behavior name="versionable">
            <parameter name="log_created_at" value="true" />
            <parameter name="log_created_by" value="true" />
        </behavior>
    </table>

    <table name="test_address" namespace="test\Model">
        <column autoIncrement="true" name="id" primaryKey="true" required="true" type="INTEGER" />
        <column name="address1" required="true" size="255" type="VARCHAR" />
        <column name="address2" required="true" size="255" type="VARCHAR" />
        <column name="address3" required="true" size="255" type="VARCHAR" />
        <column name="zipcode" required="true" size="10" type="VARCHAR" />
        <column name="city" required="true" size="255" type="VARCHAR" />
        <column name="country_id" required="true" type="INTEGER" />
        <foreign-key foreignTable="country" name="fk_test_address_country_id" onDelete="RESTRICT" onUpdate="RESTRICT">
            <reference foreign="id" local="country_id" />
        </foreign-key>
    </table>

c'est dans la loop test que j'essai de trier par Country

Offline

#19 Re: trier par...

(11-09-2015 13:16:51)


Bon ben voilà. Tu  as donc toutes les méthodes pour faire des jointures entre test et test_address, et entre test_address et country.


OpenStudio Toulouse

Offline

#20 Re: trier par...

(11-09-2015 18:57:47)


ben je dois être trop .... Debutant
j'aimerai dans ma loop récupérer les champs des tables test et test_address en triant par le champ country traduit dans la langue locale

je ne vois pas comment faire
$search est référencé à la table test
je fais un RIGHT JOIN avec la table test_address
et j'applique configureI18nProcessing
ça ne marche pas sad

quelle procédure ? où je me trompe ?

Offline

#21 Re: trier par...

(14-09-2015 12:31:58)


Apparemment personne peut me guider dans mon problème  sad

Offline

#22 Re: trier par...

(14-09-2015 13:20:54)


A part écrire le code à ta place, je ne vois pas comment t'aider plus.


OpenStudio Toulouse

Offline

#23 Re: trier par...

(14-09-2015 14:02:04)


je souhaite comprendre je ne veux pas de code tout fait
le déroulement, la procédure

je démarre par la base test
je fais un RIGHT JOIN avec la table test_address

$search = TestQuery::create();
$search
         ->rightJoinTestAddress();

je n'ai en retour que les champs de la table test  normal ???

$search = TestQuery::create();
$searchaddress = TestAddressQuery::create();
$this->configureI18nProcessing(
   $searchaddress,
   array('TITLE', 'CHAPO', 'DESCRIPTION', 'POSTSCRIPTUM'),
   CountryTableMap::TABLE_NAME,
   'COUNTRY_ID'
);
$search->addAscendingOrderByColumn('i18n_TITLE');
$search->addSelectQuery($searchaddress, 'tableaddress')
            ->where('tableaddress.ID =',TestTableMap::ADDRESS_ID)
;

marche pas
par quoi je dois commencer
comment récupérer tous les champs ?

Offline

#24 Re: trier par...

(14-09-2015 14:51:28)


Je t'ai déjà expliqué que avec configureI18nProcessing(), çà ne peut pas marcher.

je n'ai en retour que les champs de la table test  normal ???

Oui, si tu fais une TestQuery, tu n'auras que les champs de la table test. Si tu veux récupérer des colonnes présentes dans la jointure, regarde ici dans la doc Propel : http://propelorm.org/Propel/reference/m … ng-columns


OpenStudio Toulouse

Offline

#25 Re: trier par...

(14-09-2015 15:00:36)


Merci ROADSTER31
C'est tout ce que je demande des pistes de recherche
je n'avais pas encore vu cette page sur propel

Merci