Estou trabalhando em um aplicativo de blog no Laravel 8 .
Estou tentando exibir artigos por tag na seguinte rota:
Route::get('/tag/{tag_id}', [ArticlesController::class, 'tag'])->name('tag');
No ArticlesController
controlador, tenho o tag()
método que deve exibir todas as postagens que contêm uma determinada tag:
public function tag($tag_id)
{
$tag = Tag::firstWhere('id', $tag_id);
$articles = Article::where('id', $tag->id)->orderBy('id', 'desc')->paginate($this->per_page);
return view(
'themes/' . $this->theme_directory . '/templates/index',
array_merge($this->data, [
'tag' => $tag,
'articles' => $articles
])
);
}
Há um relacionamento muitos-para-muitos entre artigos e tags. Eu tenho uma article_tag
tabela dinâmica:
No Tag
modelo eu tenho:
class Tag extends Model
{
use HasFactory;
protected $fillable = ['name'];
public function article()
{
return $this->belongsToMany(Article::class);
}
}
Ao Article
modelo adicionei o tags()
método
public function tags()
{
return $this->belongsToMany(Tag::class)->as('tags');
}
O problema
Exibe /tag/1
apenas um artigo e esse artigo não contém uma tag com o id 1.
Questões:
- Onde está meu erro?
- Qual solução funcional requer alterações mínimas no código atual?
Parece que o problema é que você pega o artigo usando o id da tag e não verifica se essa tag está anexada ao artigo
where('id', $tag->id)
Tente usar
whereHas
na consulta de artigos:https://laravel.com/docs/8.x/eloquent-relationships
Onde está meu erro?
Seu problema é com esta linha -->
Aqui você está recuperando os artigos onde o ID do artigo é o mesmo que o ID da tag .
Solução:
Use o relacionamento muitos-para-muitos que você definiu no
Tag
modelo. Você pode recuperar os artigos usando o relacionamento assim:$tag->article
.Então seu código completo para o método tag no ArticleController: