Estoy usando relaciones elocuentes para post y tags a post_tags. Lo que intento hacer es crear secciones de posts en mi vista frontal con tags específico. Como si tuviera una sección 1, debería tener todas las publicaciones de la etiqueta "new", la sección 2 debería tener todas las publicaciones de la etiqueta "old", etc. Y quiero que todo esto pasar en una misma vista.

Publicar modelo

public function tags()
{
    return $this->belongsToMany('App\Tag', 'post_tag');
}

Modelo de etiqueta

 public function posts()
 {
     return $this->belongsToMany('App\Post', 'post_tag');
 }

Controlador

public function index()
{
    $posts = Post::all();
    return view('frontend.index')->withPosts($posts);    
}

Por favor, ayúdame:)

1
Hussyn Naqvi 23 oct. 2017 a las 09:23

3 respuestas

La mejor respuesta

Puede obtener todas las etiquetas al cargar las publicaciones:

public function index()
{
    $tags = Tag::with('posts')->get();
    return view('frontend.index')->withTags($tags);    
}

En la vista, puede hacer algo como esto:

@foreach ($tags as $tag)
    <h2>Tag : {{ $tag->name }}</h2>
    @foreach ($tag->posts as $post)
        <p>Post : {{ $post->title }}</p>
    @endforeach
@endforeach

Para obtener las publicaciones donde tienes una etiqueta:

public function index()
{
    $tagName = 'new';
    $posts = Post::whereHas('tags', function ($q) use($tagName) {
        $q->where('name', $tagName);
    })->get();
    return view('frontend.index')->withTagName($tagName)->withPosts($posts);
}

Y en la vista puedes hacer esto:

<h2>Tag : {{ $tagName }}</h2>
@foreach ($posts as $post)
    <p>Post : {{ $post->title }}</p>
@endforeach

Si desea hacer consultas desde la vista, puede hacerlo de esta manera ( pero no es una práctica de Dios porque la vista es solo para ver el contenido, no para obtenerlo de la base de datos ):

<?php foreach ((\App\Post::whereHas('tags', function ($q) use($tagName) {
                    $q->where('name', $tagName);
                })->get()) as $post) { ?>

            <p>Post : {{ $post->title }}</p>

<?php } ?>
0
Maraboc 23 oct. 2017 a las 14:30

Para obtener todas las publicaciones con etiquetas con el nombre new, haga esto:

Post::whereHas('tags', function ($q) {
    $q->where('name', 'new');
})->get();
1
Alexey Mezenin 23 oct. 2017 a las 06:41

Es la solución, no la respuesta perfecta
Puedes manejar esta situación de dos maneras

1- send two objects from controller to view seprate one for only new tag and second without new tag

2- puedes manejar esta situación en el front-end usando condiciones

@if($user->tag == "new")
{$user->show}
@endif
0
Mudassir 23 oct. 2017 a las 13:41