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


Onouriis
Auteur
Réponse acceptée

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
Réponse acceptée

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

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
Auteur

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

Dans ton model Type pardon

Onouriis
Auteur

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');
}

A aucun moment tu ne fais de select ?

Onouriis
Auteur

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 ?

Onouriis
Auteur

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 ?

Onouriis
Auteur

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();
Onouriis
Auteur

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');
Onouriis
Auteur

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.

Onouriis
Auteur

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.

Et si tu fais

Categorie::all()

Tu obtiens bien tes catégories ?

Onouriis
Auteur

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
Auteur

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 !

Regarde du côté de PHP_INT_MAX

Onouriis
Auteur

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 ?

Onouriis
Auteur

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. ;)