Problème Query Builder Eloquent (5.2)

Par Onouriis, il y a 10 ans


Bonjour

J'ai un problème avec Eloquent et la profondeur des relations. Le problème réel est que la requête ne fonctionne pas sur le serveur live (hébergé chez OVH) alors que sur mon local je n'ai aucun problème.

J'explique, j'ai une requête de type :

$articles = Article::with('type', 'type.categorie')->get();

En local, je récupère bien le contenu de la catégorie de la laison correspondante mais sur le live, impossible de le récupérer. J'obtiens un :

$articles->type->categorie = null;

Impossible de trouver la solution par moi-même. Je peux confirmer à 99% qu'il ne s'agit pas d'un problème de base de données puisque j'ai essayé plusieurs fois des imports de l'un vers l'autre et ça fonctionne toujours en local.

En espérant que quelqu'un est déjà eu ce problème et puisse m'aider à la résoudre.

Merci d'avance.

25 réponses

Alexandre #lbac, il y a 10 ans

Salut,

As tu essayé dans ton model Article, dans la relation type de rajouter un ->with(''); comme ceci :

public function type() { return $this->hasMany(Type::class)->with('categorie'); }
Onouriis, il y a 10 ans

Ne fonctionne pas parce que Article n'a pas de relation directe avec Categorie.

Alexandre #lbac, il y a 10 ans

Dans ton model Type pardon

Onouriis, il y a 10 ans

Mmmmh pas possible si ?
Un rappel de mes différents Model :

/*ArticleModel*/ public function type(){ $this->belongsTo('App\Model\Type'); } /*TypeModel*/ public function categorie(){ $this->belongsTo('App\Model\Categorie'); }
AlexJM, il y a 10 ans

A aucun moment tu ne fais de select ?

Onouriis, il y a 10 ans

Non, je ne fais pas de select. De plus la debugbar m'indique que la requête sur la table categories est bien effectuée sur le serveur live (comme en local).

SELECT * FROM categories WHERE id IN (listeDesDifférentsId)
Azorgh, il y a 10 ans

Hello,

Remarque bête, mais le paramètre de la fonction with() est soit un tableau, soit une string. Je vois que tu lui donne 2 paramètres string.
Pourrait tu essayer comme ceci :

$articles = Article::with(['type', 'type.categorie'])->get(); dd($articles);

Et nous dire ce qui se trouve dans le debug au niveau de la liste des relations ?

Onouriis, il y a 10 ans

Oui effectivement, j'ai fait l'erreur lorsque j'ai écrit ici mais dans le fichier c'est bien un tableau.
Ca m'exaspère ce style de problème. :(

Azorgh, il y a 10 ans

Je vais être chiant, mais tu es sur de sur que ta catégorie est relié au bon type ?
Si tu execute la requête présente dans la DebugBar direct dans PHPMyAdmin, ça te sort un résultat ?

Onouriis, il y a 10 ans

Non tu n'es pas chiant au contraire quand on es le nez dans notre code toute la journée, on ne voit pas forcément des erreurs parfois bête.
Je viens de retester et je te confirme qu'en exécutant la requête SQL de la DebugBar dans PHPMyAdmin, la rêquete me renvoie bien les bons résultats.
Et je suis sur que le l'article a un type connu de la bdd et que ce type a bien une catégorie connu de la bdd. (quand j'importe la bdd du serveur sur mon local, j'arrive à récupérer les résultats)

MaMouT, il y a 10 ans

Salut,
As-tu résolu ton problème ?
Sinon, tu peux tester ça ?

$articles = Article::with('type')->with('categorie')->get();
Onouriis, il y a 10 ans

Yo,
Ne fonctionne pas mieux. :(
Mais vu que cela fonctionne en local, que lorsque j'importe la bdd du serveur vers mon local, ça fonctionne encore. Est-ce que ce problème peut être lié au mutualisé OVH ?

MaMouT, il y a 10 ans

Tu peux tester ça :

$articles = Article::get(); $articles->load('type'); $articles->load('categorie');
Onouriis, il y a 10 ans

Toujours pas résolu. Ce bug reste un mystère pour moi.
J'ai testé avec CakePHP et je n'ai pas ce problème...

Onouriis, il y a 10 ans

Du coup je te confirme que PHP_INT_MAX me renvoie 2147483647.
J'imagine que sur des mutualisés OVH, on ne peut pas faire grand chose.

Alexandre #lbac, il y a 10 ans

Est-ce que la méthode with marche à un autre endroit sur ton script ?

Ca pourrait venir de ton serveur qui ne dispose pas de toutes les configurations nécessaires pour faire tourner laravel.

Onouriis, il y a 10 ans

Ouioui, puisque pour un Article j'arrive à récupérer l'User et le Type. C'est cette double profondeur dans les relations qui ne semble pas fonctionner sur le serveur.

AlexJM, il y a 10 ans

Et si tu fais

Categorie::all()

Tu obtiens bien tes catégories ?

Onouriis, il y a 10 ans

Je récupère bien toutes mes catégories.
De même lorsque je fais :

Categorie::with(["types", "types.articles", "types.articles.user"])

J'obtiens bien ma cascade de relation.

Onouriis, il y a 10 ans

Des petites nouvelles après de nombreux nouveaux test :

$request1 = Article::with(['user', 'type', 'type.category']) ->whereIn('id', $listId)->paginate(10); //même chose avec Article::with(['user', 'type', 'type.category']) ->where('id', $id)->paginate(10); $request1->type->category = null; $request2 = Article::with(['user', 'type', 'type.category'])->where('user_id', $userId)->paginate(10); $request2->type->category = (contenu de ma catégorie);

Malheureusement c'est de la première requête que j'ai besoin !

Onouriis, il y a 10 ans

Du coup je pense que je viens de trouver la solution. Ma catégorie a un id double qui dépasse 2147483647. Lorsque que je débug en partant de la catégorie pour récupérer les types. Je ne récupère aucun type si ma catégorie a un id supérieur à 2147483647.
Quelqu'un a déjà été confronté à ce problème ?

AlexJM, il y a 10 ans

Regarde du côté de PHP_INT_MAX

AlexJM, il y a 10 ans

En effet, j'en doute, vois soit avec le support, soit avec une version ultérieure de php, qui sait ?

Onouriis, il y a 10 ans

Du coup le problème est résolu. Deux semaines pour trouver ce problème, je suis un peu triste quand même, je m'attendais à ""mieux"".

Merci à tout ceux qui ont essayé de m'aider. ;)

AlexJM, il y a 10 ans

De rien, et pense à passer le sujet en résolu ;)