78 votes

laravel : la fonction dans le modèle doit retourner une instance de relation

J'essaie de construire un chemin pour un modèle sur laravel

J'ai créé une fonction dans mon modèle :

public function path()
{
    return App\Helper\GeneralController::getURL($this);
}

con dd(App\Helper\GeneralController::getURL($this)) test j'ai obtenu la bonne réponse. (la sortie est une URL)

mais en vue de l'appel : $article->path Je reçois cette erreur :

App\Article:: path must return a relationship instance.

Qu'est-ce qui ne va pas ?

0 votes

Quelle url voulez-vous obtenir en getURL ? Avez-vous vérifié docs ça peut aider.

148voto

Alexey Mezenin Points 86781

Vous devez l'appeler :

$article->path()

Quand vous le faites $article->path vous essayez d'utiliser la relation Eloquent que vous n'avez pas.

3 votes

J'en étais conscient, mais je n'avais pas remarqué que je n'avais pas ajouté "()" à ma ligne de code. Ainsi, il essayait d'accéder à une propriété au lieu d'exécuter une méthode. Je me suis dit "qu'est-ce que je fais de mal " :'). Merci de m'avoir fait voir la lumière.

1 votes

Exactement. Lorsqu'il y a une relation éloquente, lorsque vous appelez le nom d'une méthode UNIQUEMENT à partir de Model, elle renvoie l'objet avec la relation. Cependant, lorsqu'il n'y a pas de relation éloquente, par exemple dans ce cas la chaîne url, la méthode doit être appelée comme un php ordinaire. method() .

23voto

pwyg Points 136

Je sais que cela a déjà été répondu et accepté. Cependant, si le PO souhaite utiliser un accesseur de propriété plutôt qu'une méthode, utilisez la syntaxe "get{nom de la propriété}Attribut" de Laravel pour créer un attribut personnalisé.

Voici à quoi cela ressemblerait dans ce cas précis :

public function getPathAttribute()
{
    return App\Helper\GeneralController::getURL($this);
}

En utilisant cette approche, "path" peut maintenant être appelé comme un attribut et ne sera pas résolu en relation en utilisant la syntaxe :

$article->path;

13voto

jynk Points 142

Tu appelles ça une relation.

$article->path

Pour appeler la méthode, utilisez '()', comme suit,

$article->path()

10voto

Ali Points 557

J'ai rencontré cette erreur quand j'ai oublié d'écrire retourner avant la relation dans le modèle !
Vérifiez maintenant !

6voto

Niklesh Points 1386

path() est une méthode et non un élément d'objet, vous devez l'appeler en tant que méthode.

$article->path();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X