Bonjour,

Voici un aperçu de ma base:

Ce que je fais

Voici ma requête que je fait avec l'ORM

$query = TableRegistry::get("Messenger")->find('all')
            ->where(["sender_id" => $userId])->orWhere(["recipient_id" => $userId])
            ->order("sending_timestamp")
            ->contain([
                "Recipient" => ["UserInformations"],
                "Sender"  => ["UserInformations"]
            ])
            ->page($optn["page"], $optn["count"]);

Ce que je veux

J'aimerais récupérer les informations liés à recipient_id et à sender_id en passant par la table User.

Ce que j'obtiens

J'obtiens:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'UserInformations.recipient_id' in 'on clause'

Merci

8 réponses


Bonjour.
Si je comprends bien, tu n'utilises pas le Framework, mais juste son ORM.
C'est bien ça ?
Pourquoi tu nommes aussi différemment de la manière que tu les appelles via les requêtes SQL ?
Surtout par exemple, que tu nous montres la structure de 3 tables, et que dans ta requête SQL tu utilises un nom de champ qui n'existe pas dans ta table, sans compter que tu n'as aucun champ de type TIMESTAMP dans aucune des trois tables que tu nous montre, je vois donc mal comment tu peux sauvegarder le timestamp d'une sauvegarde d'enregistrement pour l'envoi d'un message.

Alors, oui, j'utilise uniquement l'ORM de cakephp.
L'image montre juste un aperçu, réalisé à la va-vite pour illustrer. De plus, j'utilise un champ INT pour les sauvegarde car les champs TIMESTAMP me renvoient une date pré-formatée que je ne souhaite pas.

Si ce que tu nous montres ne correspond pas exactement à la structures des tables concernées par ta demande d'aide, pourquoi est-ce que tu nous montres ça ?
Si tu nous fournies des données faussées, nous ne pourrons pas t'aider efficacement.
Au cas où tu ne le saches pas, tu peux très bien modifier le formatage des champs de type DATE et compagnie dans les entité, sans compter en plus que tu peux utiliser le Behavior Timestamp qui permet de contrôler le formatage de sortie de ce type de champ

J'ai modifié l'image

Au cas où tu ne le saches pas, tu peux très bien modifier le formatage des champs de type DATE et compagnie dans les entité, sans compter en plus que tu peux utiliser le Behavior Timestamp qui permet de contrôler le formatage de sortie de ce type de champ

Je me renseignerais

Sinon, pour ton erreur, lorsque tu fais des associations dans tes requêtes SQL, il est préférable de prefixer le nom des champs que tu utilises dans ta requêtes par le nom du modèle lié au champ, pour éviter que l'ORM ne puisse confondre la table dans laquelle il doit rechercher le champ demandé.
Car si tu regardes bien, il cherche le champ recipient_id dans la table UserInformations, mais comme dans les conditions il n'a du n'y trouver le champ sender_id, ni le champ recipient_id, il s'arrête à la dernière condition.
Donc dans ta requête, remplaces :

->where(["sender_id" => $userId])->orWhere(["recipient_id" => $userId])

Par :

->where(["Messenger.sender_id" => $userId])->orWhere(["Messenger.recipient_id" => $userId])

Car dans les conditions, tu peux très bien spécifier des champs d'une autre table, mais l'ORM ne peut pas deviner sur quelle table tu cherches à faire les conditions.

Même en préfixant comme tu as fait, ça ne fonctionne pas :/

Tu as toujours la même erreur ?
Si c'est le cas, il te faut regarder du côté de tes classes tables concernant la définition des associations.

Voici les classes tables.

La table Messenger:

`$this->belongsTo("Sender", [
            "className" => "User",
            "foreignKey" => "sender_id"
        ]);
        $this->belongsTo("Recipient", [
            "className" => "User",
            "foreignKey" => "recipient_id"
        ]);
        $this->entityClass("MessageEntity");

La table User:

$this->hasMany("MessengerSender",[
            "className" => "Messenger",
            "foreignKey" => "sender_id"
        ]);
        $this->hasMany("MessengerRecipient",[
            "className" => "Messenger",
            "foreignKey" => "recipient_id"
        ]);
        $this->hasMany("TalkMessage");
        $this->hasOne("UserInformations");
        $this->entityClass("UserEntity");

La table UserInformations:

$this->belongsTo("User");
$this->entityClass("UserInformationsEntity");