I can not use foreach with object twice in the same view in laravel

2

I have a big problem that I can not solve because I am still a beginner in Laravel. The problem is that I'm developing a web application and I need to list the cities object in two different select, however when I add the second foreach it gives an error saying that it can not find the object but when I delete this foreach and leave only one the application works normally. Here is the part of the code where I need to do the two listings:

             

    <!-- Modal content-->
    <div class="modal-content">
        <div class="modal-body">
            <div class="row">
                <div class="col-md-12">
                    <img src="/img/banner.png" class="img-responsive">
                </div>
                {!! Form::open(['url'=>'index/oportunidades']) !!}
                <div class="col-md-12">

                        <div class="form-group">
                            {!! Form::label('cidades', 'Selecione uma Cidade:') !!}
                            <select class="form-control" id="sel1" name="cidade">
                                @foreach($cidades as $cidades)
                                    <option value="{{$cidades->id}}">{{ $cidades->nome }} - {{ $cidades->estado->sigla }}</option>
                                @endforeach
                            </select>
                        </div>
                        <div class="form-group">
                            {!! Form::label('categorias', 'Selecione uma Categoria:') !!}
                            <select class="form-control" id="sel1" name="categoria">
                               @foreach($categorias as $categorias)
                                    <option value="{{$categorias->id}}">{{$categorias->nome}}</option>
                               @endforeach
                            </select>
                        </div>
                </div>
                <div class="col-md-12">
                    <button class="btn btn-warning" type="submit">Filtrar</button>
                </div>
                {!! Form::close() !!}

            </div>
        </div>

    </div>

    </div>
</div>

<!-- Modal Empresas -->
<div id="ModalEmpresas" class="modal fade" role="dialog">
    <div class="modal-dialog">

    <!-- Modal content-->
    <div class="modal-content">
        <div class="modal-body">
            <div class="row">
                <div class="col-md-12">
                    <img src="/img/banner.png" class="img-responsive">
                </div>
                {!! Form::open(['url'=>'index/oportunidades']) !!}
                <div class="col-md-12">

                        <div class="form-group">
                            {!! Form::label('cidades', 'Selecione uma Cidade:') !!}
                            <select class="form-control" id="sel1" name="cidade">
                                @foreach($cidades as $cidades)
                                    <option value="{{$cidades->id}}">{{ $cidades->nome }} - {{ $cidades->estado->sigla }}</option>
                                @endforeach
                            </select>
                        </div>
                        <div class="form-group">
                            {!! Form::label('categorias', 'Selecione uma Categoria:') !!}
                            <select class="form-control" id="sel1" name="categoria">
                               @foreach($categorias as $categorias)
                                    <option value="{{$categorias->id}}">{{$categorias->nome}}</option>
                               @endforeach
                            </select>
                        </div>
                </div>
                <div class="col-md-12">
                    <button class="btn btn-warning" type="submit">Filtrar</button>
                </div>
                {!! Form::close() !!}

            </div>
        </div>

    </div>

    </div>
</div>

And below the controller code:

public function index(){
    $cidades = cidades::all();
    $categorias = categorias::all();
    $oportunidades = oportunidades::all();
    return view('index', compact('cidades', 'categorias', 'oportunidades'));
}
    
asked by anonymous 26.10.2017 / 20:07

2 answers

3

The error :

@foreach($cidades as $cidades)
    <option value="{{$cidades->id}}">
          {{ $cidades->nome }} - {{ $cidades->estado->sigla }}
    </option>
@endforeach

Explanation: no foreach in the collection of cities being passed to the same variable, can not override it is a concept error, change variable name:

Correct :

@foreach($cidades as $c)
    <option value="{{$c->id}}">
          {{ $c->nome }} - {{ $c->estado->sigla }}
    </option>
@endforeach

The same case happens in Categories, it arranges the name of the variable, it can not be the same name of the collection.

Another optimization is in your controller in% with% cities force status loading , this improves performance because it generates 2 model need, the other to each interaction is done a query in the bank (low performance):

public function index()
{
    $cidades = cidades::with('estado')->get();  
    $categorias = categorias::all();
    $oportunidades = oportunidades::all();
    return view('index', compact('cidades', 'categorias', 'oportunidades'));
}
    
26.10.2017 / 21:10
0

I finally solved the problem! It is because in the first foreach I assigned the variable $ cities to my object $ cities then in the second foreach it took the variable $ cities and not $ objects city. That is, it was only a variable repetition error.

    
01.11.2017 / 19:58