Reputation: 37
How do I update an edit field in laravel?
I've tried the sync () method, detach with atach () unsuccessfully, I ask your help with this.
I really appreciate anyone who can help me with this
Remembering, I already managed to save the values with the create method, follow the codes:
My controller:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Pedido;
use App\Models\Cliente;
use App\Models\Produto;
class PedidosController extends Controller
{
/**
* mostrar conteudo no index
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$pedidos = Pedido::orderBy('id', 'asc')->paginate(2000);
return view('pedidos.index', compact('pedidos'));
}
/**
* Mostra o form para criar um novo pedido.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
$clientes = Cliente::all();
$produtos = Produto::all();
return view('pedidos.create', compact('clientes', 'produtos'));
}
/**
* armazena um novo pedido pra enviar ao BD
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$request->validate([
'status' => 'required',
'clientes_id' => 'required',
'produtos_id' => 'required'
]);
$pedido = Pedido::create($request->only([
'pedidos_id',
'produtos_id',
'clientes_id'
]));
$cliente = Cliente::find($request->clientes_id);
$pedido->clientes()->save($cliente);
$produto = Produto::find($request->produtos_id);
$pedido->produtos()->attach($produto);
return redirect()->route('pedidos.index')
->with('success', 'Pedido cadastrado com sucesso');
}
/**
* Exibe um pedido
*
* @param \App\Models\Pedido $pedido
* @return \Illuminate\Http\Response
*/
public function show(Pedido $pedido)
{
return view('pedidos.show', compact('pedido'));
}
/**
* Exibe um pedido para edição
*
* @param \App\Models\Pedido $pedido
* @return \Illuminate\Http\Response
*/
public function edit(Pedido $pedido)
{
$clientes = Cliente::all();
$produtos = Produto::all();
return view('pedidos.edit', compact('pedido', 'clientes', 'produtos'));
}
/**
* Atualiza um pedido no BD
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\Pedido $pedido
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Pedido $pedido)
{
$request->validate([
'status' => 'required',
'clientes_id' => 'required',
'produtos_id' => 'required',
]);
$pedido->update($request->all());
return redirect()->route('pedidos.index')
->with('success', 'Pedido atualizado com sucesso');
}
/**
* Remove um pedido do BD
*
* @param \App\Models\Pedido $pedido
* @return \Illuminate\Http\Response
*/
public function destroy(Pedido $pedido)
{
$pedido->delete();
return redirect()->route('pedidos.index')
->with('success', 'Pedido deletado com sucesso');
}
}
my edit:
@extends('layouts.app')
@section('content')
<div class="container content">
<div class="row">
<div class="col-md">
<p class="text-center fs-1">Editar o pedido nº{{$pedido->id}}</b></p>
<div class="float-left">
<a class="btn btn-primary" href="{{ route('pedidos.index') }}" title="Voltar"> <i class="fas fa-backward "></i> </a>
</div>
</br>
@if ($errors->any())
<div class="alert alert-danger">
<strong>Ops!</strong> Há um problema com seu Pedido<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<div class="row h-100">
<div class="col">
<form action="{{ route('pedidos.update', $pedido->id) }}" method="POST">
@csrf
@method('PUT')
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-12">
<label for="selectBox"> Cliente selecionado: </label>
<select style=width:400px name="clientes_id" class="form-control" onfocus="this.selectedIndex = -1;">
@foreach ($pedido->clientes as $cliente)
<option selected value="{{ $cliente->id}}">{{ $cliente->nome}}</option>
@endforeach
@foreach($clientes as $cliente)
<option value="{{ $cliente->id}}">{{ $cliente->nome}}</option>
@endforeach
</select>
</br>
<div class="custom-select">
<label for="selectBox"> Status selecionado: </label>
<select style=width:400px name="status" class="form-control" onfocus="this.selectedIndex = -1;">
<option selected> {{ $pedido->status }}</option>
<option value=aberto>Em aberto</option>
<option value=pago>Pago</option>
<option value=cancelado>Cancelado</option>
</select>
</div>
</br>
<label for="selectBox"> Escolha um produto: </label>
<select style=width:400px class="form-control" name="produtos" id="selectBox" onfocus="this.selectedIndex = -1;" onchange="addProduct(options);">
@foreach ($produtos as $produto)
<option value="{{ $produto->id}}">{{ $produto->nome}}</option>
@endforeach
</select>
</br></br>
<table class="table">
<thead>
<tr>
<th>Código Produto</th>
<th>Produto selecionado</th>
<th>Remover</th>
</tr>
</thead>
<tbody id="tbody">
@foreach ($produtos as $key => $produto)
<tr>
<td>
<input type="hidden" name="produtos_id[{{$key}}]" value="{{ $produto->id}}">{{ $produto->id}}
</td>
<td>
{{ $produto->nome}}
</td>
<td>
<input type='button' value='Remover' onclick='removeProduct()' />
</td>
</tr>
@endforeach
</tbody>
</table>
</br>
<div class="col-xs-12 col-sm-12 col-md-12 text-center">
<button type="submit" class="btn btn-primary">Enviar</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<script>
var table = document.getElementById('tbody');
var count = linhas;
function addProduct(product) {
table.innerHTML += "<tr><td><input type='hidden' name='produtos_id[" + count + "]' value='" + product[product.selectedIndex].value + "'>" + product[product.selectedIndex].value + "</td><td>" + product[product.selectedIndex].innerText + "</td><td><input type='button' value='Remover' onclick='removeProduct()'/></tr></td>";
count++;
}
function removeProduct() {
var td = event.target.parentNode;
var tr = td.parentNode;
tr.parentNode.removeChild(tr);
count--;
}
</script>
@endsection
Pedido model
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Pedido extends Model
{
protected $table = 'pedidos';
public $timestamps = true;
protected $fillable = [
'status',
'clientes_id',
'created_at'
];
public function clientes()
{
return $this->hasMany(Cliente::class, 'id', 'clientes_id');
}
public function produtos()
{
return $this->belongsToMany(Produto::class, 'pedidos_produtos', 'pedidos_id', 'produtos_id');
}
}
Produto Model
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Produto extends Model
{
use HasFactory;
protected $table = 'produtos';
public $timestamps = true;
protected $casts = [
'preco' => 'float'
];
protected $fillable = [
'nome',
'descricao',
'preco',
'quantidade',
'created_at'
];
public function pedidos()
{
return $this->belongsToMany(Pedido::class, 'pedidos_produtos', 'produto_id', 'pedidos_id');
}
}
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Produto extends Model
{
use HasFactory;
protected $table = 'produtos';
public $timestamps = true;
protected $casts = [
'preco' => 'float'
];
protected $fillable = [
'nome',
'descricao',
'preco',
'quantidade',
'created_at'
];
public function pedidos()
{
return $this->belongsToMany(Pedido::class, 'pedidos_produtos', 'produto_id', 'pedidos_id');
}
}
Upvotes: 2
Views: 137
Reputation: 850
you need to try this code. it will work.
$produtoId = [];
foreach ($produto as $pdt) {
$produtoId[] = $pdt->id;
}
$pedido->produtos()->sync($produtoId);
$pedido->update($request->all());
Upvotes: 3