Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

Popular form update com dados de duas tabelas relacionais no laravel

Galera como eu faço para popular o select do formulário de alteração, com duas tabelas relacionais, tenho produto e preciso dar um foreach nessa categoria, como seria enviar pelo método update do controller? alguém pode me ajudar? @extends('layouts.template-products')

@section('title', 'Alterar produtos')

@section('content-products')

<div class="container">
    <div class="row">
    @if($errors->all())
            <div class="alert alert-danger">
                <ul>
                    @foreach($errors->all() as $error)
                    <li>
                        {{ $error }}
                    </li>
                    @endforeach
                </ul>
            </div>
            @endif
        <h1>Alterar produto</h1>
            <form action="/products/update" method="post" enctype="multipart/form-data">
            <input type="hidden" name="_token" value="{{ csrf_token() }}">
            <input type="hidden" name="id" value="{{ $produto->id }}">
                <div class="form-group">
                    <label for="produto">Produto</label>
                    <input type="text" class="form-control" name="produto" value="{{ $produto->produto }}">
                </div>

                <div class="form-group">
                    <label for="preco">Preço</label>
                    <input type="text" class="form-control" name="preco" value="{{ $produto->preco }}">
                </div>

                <div class="form-group">
                    <label for="quantidade">Quantidade</label>
                    <input type="text" class="form-control" name="quantidade" value="{{ $produto->quantidade }}">
                </div>

                <div class="form-group">
                    <label for="quantidade">Tamanho</label>
                    <input type="text" class="form-control" name="tamanho" value="{{ $produto->tamanho }}">
                </div>

                <div class="form-group">
                    <label for="categoria">Categoria</label>
                    <select name="categoria_id" id="categoria" class="form-control">
                    <option value=""> -- </option>
                        <optgroup label="Selecione uma categoria">
                        @foreach($categorias as $categoria)
                            <option value="{{ $categoria->id }}">{{ $categoria->name }}</option>
                            @endforeach
                        </optgroup>
                    </select>
                </div>

                <div class="form-group">
                    <label for="descricao">Descrição</label>
                    <textarea name="descricao" class="form-control" id="" cols="30" rows="10">{{ $produto->descricao }}</textarea>
                </div>

                <button class="btn btn-default" type="submit">Alterar</button>
            </form>
    </div>
</div>

@stop

Método do meu controller para popular input's

public function alter($id)
    {
        $produto = Produto::find($id);

        return view('products.alter')->with('produto', $produto);
    }
9 respostas

Oi Esveraldo, tudo bom?

Seu form está apontando para a rota /products/update. Nessa rota você precisará carregar seu produto:

        $produto = Produto::find($id);

Além disso, vamos precisar pegar o id da categoria e carregar ela tb:

$categoriaId = Input::get('categoria_id');
$cateogria = Categoria::find($cateogora_id)

Relacionar sua categoria com seu produto:

$produto->setCategoria($categoria);

E então persistir seu produto alterado no banco:

$produto->save();

Espero ter ajudado =)

Abraço!

André, obrigado por responder meu velho, agora está dando esse erro:

Call to undefined method Illuminate\Database\Query\Builder::setCategoria()

Pode me ajudar?

Opa, posso dar uma olhada no seu código? compartilha com a gente aqui, assim fica mais fácil descobrir o problema =)

André, antes de mais nada obrigado mais uma vez por me ajudar, subi o projeto inteiro para o github, foi a maneira que interpretei que você queria ver o código...

Baixe aqui

Fico no aguardo meu velho...

Opa, dando uma olhada no seu código e em algumas referencias do eloquent:

https://laravel.com/docs/5.4/eloquent#updates e http://stackoverflow.com/questions/24702640/laravel-save-update-many-to-many-relationship

Parece que o jeito é relacionar pelo associate. No seu exemplo seria algo como:

class Produto extends Model
{
     public $timestamps = false;
    protected $fillable = [
        'produto',
        'descricao',
        'preco',
        'quantidade',
        'tamanho',
        'categoria' // relacionamos a categoria, não o id
    ];
    public function categoria()
    {
        return $this->belongsTo('App\Categoria');
    }
}

// No controller

 public function alter($id)
    {
        $produto = Produto::find($id);
        $categoria_id = Request::input('categoria_id');
        $categoria = Categoria::find($categoria_id);
        $produto->categoria()->associate($categoria); // associamos antes de persistir
        $produto->save();

        return view('products.alter')->with('produto', $produto);
    }

Vê se assim rola, qlqr coisa problema é só dar um toque =)

Beleza André, o erro agora passou para a view:

Undefined variable: categorias (View: /home/esveraldo/www/blog/resources/views/products/alter.blade.php)

Como eu posso o foreach lá? para popular um select?

Outra coisa, dando um dd não aparece nenhum dado da tabela categoria...

Não teria como fazer outra rota com outro método para enviar os dados para o form?

André, consegui resolver meu velho, se quiser que eu compartilhe a solução é só falar, não está 100% elegante, mas está funcional

Compartilha com a gente! Assim se outra pessoa tiver o mesmo problema, fica aqui a solução =)

Abraço!

solução!

Valeu André...

Solução aqui