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.
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 ?
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');
}
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');
}
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)
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 ?
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. :(
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 ?
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)
Salut,
As-tu résolu ton problème ?
Sinon, tu peux tester ça ?
$articles = Article::with('type')->with('categorie')->get();
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 ?
Tu peux tester ça :
$articles = Article::get();
$articles->load('type');
$articles->load('categorie');
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...
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.
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.
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.
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 !
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.
En effet, j'en doute, vois soit avec le support, soit avec une version ultérieure de php, qui sait ?
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. ;)