wdjopa
wdjopa 80 XP
a posé

Relations ManyToMany - OrderBy & Paginate

Hello les devis,

Mon problème est le suivant :

J'ai un model Tag qui est associé à un autre model Blog par une relation ManyToMany (c'est à dire avec une table intermédiaire blog_tag).

Je souhaite alors afficher les 5 premiers des Tags d'un Blog (rangé par order alphabétique)

J'ai essayé ceci :

$tags = $blog->tags()->orderBy("name")->paginate(5);

mais ça ne fonctionne pas. J'ai ce message d'erreur

{
"message": "Method Illuminate\\Database\\Eloquent\\Collection::orderBy does not exist.",
"exception": "BadMethodCallException",
"file": "E:\\PROJETS\\WEB\\backendlamater\\vendor\\laravel\\framework\\src\\Illuminate\\Support\\Traits\\Macroable.php",
"line": 103,
"trace": [
...
]
}
mckenziearts
a répondu

Premiere question si tu veux les 5 premiers pour ne pas faire par exemple

$tags = $blog->tags()->orderBy("name")->limit(5);

Fait voir la relation que tu as entre Tag et Blog dans le model Blog. Parce que ton erreur montre que tu as une Collection a la place d'une relation ManyToMany (Query Builder)

muarachmann
a répondu
Meilleure réponse

@wdjopa tags() ces't une collection, tu as besoin d'une relationship pour utilise orderBy() donc rassure toi que dans to model Blog tags() retourne un relationship instance de HasMany()

wdjopa
wdjopa 80 XP
a répondu

@mckenziearts, la relation était :

// App/Models/Blog.php
class Blog {
public function Tag()
{
return $this->belongsToMany(Blog::class);
}
}
// App/Models/Tag.php
class Tag {
public function blogs()
{
return $this->hasMany(Tag::class);
}
}

J'ai remarqué que j'avais fait une erreur dans la définition des relations

Il faut Se connecter ou Créer un compte pour participer à cette conversation.