Filtering categories by link in same main page, error Trying to get property of non-object

1

I have a main page composed of articles that show the last articles that have been received, and list (links) of all the categories and the number of items that each category has. What I want to do is filtrar , that is to say that when clicking on a link go to the method of a controller that refers to a scope and using the same variables of the same controller method to show the main page, filter the content, that is to say that each link that you click leaves the articles for that category. The idea is to reuse the code as well as the driver variables

I've been thinking about it for a while, I'm sure it's silly but I do not see anything anymore

This is the error

  

ErrorException in c91ad600cf0c607229837e7ba61e74098bd6634d.php line   20: Trying to get property of non-object (View:   C: \ xampp \ htdocs \ HTDOCS_PHP \ Laravel_CodigoFacilito \ resources \ views \ admin \ partials \ asidefront.blade.php)   (View:   C: \ xampp \ htdocs \ HTDOCS_PHP \ Laravel_CodigoFacilito \ resources \ views \ admin \ partials \ asidefront.blade.php)

Main Controller

public function index()
    {
        $tags = \App\modelos\tag::orderBy('id','DESC')->get();
        $categorias = \App\modelos\categoria::orderBy('id','DESC')->get();

        $articulos = \App\modelos\articulo::orderBy('id','DESC')->paginate(4);  

        return View('front.index',compact('articulos','categorias','tags'));
    }

 public function buscaCategoria($nombrecat) //FUNCION PARA FILTRAR
    {

        $tags =  \App\modelos\tag::orderBy('id','DESC')->get();
        $categorias = \App\modelos\categoria::BuscaCategoria($nombrecat)->first();

        $articulos = $categorias->articulos()->paginate(4);
        return View('front.index',compact('articulos','categorias','tags'));

    }

Main View

@section('contenido')


    <h3 class="title-front left">Ultimos productos</h3>
    <hr>
    <div class="row">

        <div class="col-md-8">
            <div class="row">
                    @foreach($articulos as $articulo)
                <div class="col-md-6">
                    <div class="panel panel-info">
                        <div class="panel-heading">
                            <h3 class="panel-title text-uppercase">{{$articulo->title}}</h3>
                        </div>
                        <div class="panel-body" id="imagenesArticulos">
                            @foreach($articulo->imagenes as $imagenes)
                            <img src="{{url('/ima/articulos/'.$imagenes->nombre)}}">
                            @endforeach()
                        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Non totam, assumenda reprehenderit itaque esse ea dignissimos dolorem, at nam porro repudiandae placeat et commodi reiciendis tempora dolore est aliquid, ut facere earum molestiae hic quaerat sunt magnam. Animi nobis sequi ea aliquam saepe, minima culpa nemo. Veritatis dolor reprehenderit assumenda, nihil minima commodi tenetur aliquam, obcaecati, quisquam aspernatur, laborum dolore tempore error impedit ipsa cupiditate voluptate porro cumque. Omnis adipisci, velit labore accusamus temporibus, nam quidem consequatur beatae ab pariatur porro, quisquam, culpa asperiores nisi laborum in illo voluptates libero quo reprehenderit amet corporis. Accusantium optio autem consequatur excepturi illo dolores culpa aliquid eligendi aspernatur, temporibus, sapiente amet aut possimus tempora obcaecati quasi suscipit dolore maiores hic, sit, ipsa? Corporis vitae quia quam, ipsum repellendus quo, voluptates. A, sed pariatur consectetur eveniet, natus nobis recusandae voluptatum, beatae, numquam alias distinctio vitae id incidunt facere quos illo odio eligendi similique quasi.</p>
                        <hr>
                            <h3 class="text-center">{{$articulo->title}}</h3>

                                    <a>{{$articulo->categoria->nombre}}</a>
                        <div class="pull-right">

                                <p>{{$articulo->updated_at->diffForHumans()}}</p>
                                </div>  

                        </div>
                    </div>
                </div>
                @endforeach
            </div>

        </div>

    @include('admin.partials.asidefront')

    </div>

    <div class="row">
        <div class="col-md-12">
            {{$articulos->appends(Request::all())->render()}}
        </div>
    </div>

@endsection

Asidefront (Include in the Main View) (Here is the error)

<div class="col-md-4">
    <div class="row">
        <div class="col-md-12">

            <div class="panel panel-info">
                <div class="panel-heading">
                    <h3 class="panel-title">Categorias</h3>
                </div>
                <div class="panel-body">
                    <ul class="list-group">

                            @foreach($categorias as $categoria)

                        <li class="list-group-item">
                            <span class="badge">{{count($categoria->articulos)}}</span>
                            <a href="{{url('buscaCat/'.$categoria->nombre)}}">{{$categoria->nombre}}</a>

                        </li>
                            @endforeach


                    </ul>
                </div>
            </div>


            </div>
        <div class="col-md-12">
            <div class="panel panel-info">
                <div class="panel-heading">
                    <h3 class="panel-title">TAGS</h3>
                </div>
                <div class="panel-body" id="etiquetas" >

                    @foreach($tags as $tag)
                    <a href="{{url('buscaTag/'.$tag->tags)}}">
                        <span class="label label-info" >{{$tag->tags}}</span>
                    </a>

                    @endforeach




                </div>
            </div>


        </div>

    </div>
</div>

The main page shows it to me without problems, this happens to me when referencing the buscaCategoria method.

Any ideas? Thanks.

************************** Added First Edition ************ * Model Category

class categoria extends Model
{
    protected $table = 'categorias';

    protected $fillable = array('nombre');


     public function articulos()
    {
      return $this->hasMany('App\modelos\articulo');
    }



    public function scopeBuscaCategoria($query,$nombreCat)
    {

        return $query->where('nombre', 'LIKE','%'.$nombreCat.'%');
    }
}

DD of Home Categories

DD Search Categories Categories

Line 20 in theory is the count of these lines in the file aside

                    @foreach($categorias as $categoria)

                    <li class="list-group-item">
                        <span class="badge">{{count($categoria->articulos)}}</span>
                        <a href="{{url('buscaCat/'.$categoria->nombre)}}">{{$categoria->nombre}}</a>

                    </li>
                        @endforeach

************************ Added Second Edition ******************* *********

Model Articles

<?php


class articulo extends Model
{
    protected $table = 'articulos';

    protected  $fillable = array('title','content','categoria_id','user_id');

     public function categoria()
    {
       return $this->belongsTo('App\modelos\categoria','categoria_id', 'id');
    }

     public function imagenes()
    {
      return $this->hasMany('App\modelos\imagen');
    }

          public function tags()
    {
      return $this->belongsToMany('App\modelos\tag');
    }

           public function usuario()
    {
       return $this->belongsTo('App\User','user_id');
    }


    public function scopebuscadordeArticulos($query,$buscador)
    {
       return $query->where('title','like','%'.$buscador.'%');
    }
}

*********************** THIRD EDITION ****** SOLUTION ********* ******  public function searchCategory ($ nombrecat) // FUNCTION TO FILTER         {

        $tags =  \App\modelos\tag::orderBy('id','DESC')->get();
                    $categorias = \App\modelos\categoria::orderBy('id','DESC')->get();  
        $catporArticulo = \App\modelos\categoria::BuscaCategoria($nombrecat)->first();

        $articulos = $catporArticulo->articulos()->paginate(4);
        return View('front.index',compact('articulos','categorias','tags'));

    }
    
asked by KurodoAkabane 30.06.2016 в 11:54
source

1 answer

2

In the controller you are calling the first() method when making the query:

$categorias = \App\modelos\categoria::BuscaCategoria($nombrecat)->first();

You will only get an element and not a collection (as seen in the DD of $ categories) and therefore at the moment of counting (in the view) it tells us that $categoria is not an object (there is nothing there).

@foreach($categorias as $categoria)

The options you have are (depending on what you want to do in your application):

  • Delete the first() method from your query and replace it with get() or another method.

  • Do not do a foreach in the view, it is not necessary if you have only one object.

answered by 01.07.2016 / 02:26
source