php - 如何更新值多对多 Laravel

标签 php laravel eloquent laravel-8

如何更新 Laravel 中的编辑字段?

我尝试过sync()方法,用atach()分离 不成功,我请你帮忙。

我真的很感谢任何可以帮助我的人

记住,我已经成功地使用 create 方法保存了值,请按照代码操作:

我的 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');
    }
}

我的编辑:

@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模型

<?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');
    }
}

产品型号

<?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');
    }
}

最佳答案

您需要尝试此代码。它会起作用的。

$produtoId = [];
foreach ($produto as $pdt) {
    $produtoId[] = $pdt->id;
}
    
$pedido->produtos()->sync($produtoId);
$pedido->update($request->all());

关于php - 如何更新值多对多 Laravel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66447556/

相关文章:

php - 一般错误 : 1835 Malformed communication packet

php - 在 apache docker 容器中运行虚拟主机

php - 使用 laravel 5.5 播种 faker 命令

php - Eloquent updateOrCreate 总是创建

php - 在 Laravel 中使用 Eloquent 通过 Foreach 循环反转数组元素的顺序

php - 如何将最低索引值分配给最新行或按相反顺序排序

php - 使用 array_count_values 并得到 "Can only count STRING and INTEGER values!"错误

javascript - 在 Laravel 中从 AJAX 更新按钮 onClick url

php - 使用 composer 安装 laravel 的问题

php - 使用 Eloquent 获取按月分组的摘要