7
respostas

Como salvar mais de um registro que vem do foreach

Preciso de uma ajuda o foreach está salvando apenas um dos dados do formulário sendo que ele traz 2 registro da tabela de acordo com id do usuário

--Controller Lista os dados do usuário

public function listardados(){
        $matricula = Matricula::where('user_id', Auth::id())->get();

        //dd($matricula);
        return view('dashboard.renovacao.teste', compact( 'matricula'));
    }

-- Controller Salva

public function store(RenovacaoRequest $request){

        $user = Auth()->user();

        $dados = $request->all();

        $renovacao = Renovacao::create($dados);


        return view('dashboard.renovacao.confirmacao', compact ('renovacao'));
    }

-- View form


@extends('layouts.app') @section('content')

<div class="container">
    <div class="row">

        <form class="form-horizontal " id="regForm" action="{{route('renovacao.store')}}" method="POST">
            <div class="card-panel white">
                <h4 class="center">Solicitar Renovação</h4>
                <div class="row"></div>
                {{ csrf_field()}}
                <right>
                    <a>**Dados Cadastrados**</a>
                </right>
                <div class="row"></div>
                <div class="row"></div>
                <div class="row">
                    @foreach($matricula as $matric)
                    <div class="row">
                        <div class="col s6 m6">
                        <div class="input-field {{$errors->has('user_id') ? 'has-error' : ''}} ">
                            <label for="produto">Nome do Pai:</label>
                            <input type="text" class="form-control" name="nomerespo" value="{{ $matric->nomedopai }}">

                        </div>
                        </div>

                        <div class="col s6 m6">
                        <div class="input-field {{$errors->has('user_id') ? 'has-error' : ''}} ">
                            <label for="produto">Nome do Aluno(a):</label>
                            <input type="text" class="form-control" name="nomealuno" value="{{ $matric->nomealuno  }}">

                        </div>
                        </div>

                    </div>
                    @endforeach

                    <div class = "row">
                        <div class="col s12">

                            <a title="Voltar Para Página Principal" class="btn orange darken-4 btn-info left " href="/admin">Voltar
                                <i class="material-icons left">arrow_back_ios</i>
                            </a>

                            <button type="submit" class="btn orange darken-4 btn-info right">Confirmar
                                <i class="material-icons left">save</i>
                            </button>
                        </div>
                    </div>
                </div>
            </div>    
        </form>

    </div>
</div>
@endsection

Me passaram essa solução em outro fórum só que quando faço um dd($dados); ele retorna nada e só recarrega a pagina

As tags input no seu formulário estão com um nome fixo dentro de um @foreach isso faz que ao enviar um formulário com várias entradas apenas uma (de cada nome) seja realmente enviada.

De:

<input type="text" class="form-control" name="nomerespo" value="{{ $matric->nomedopai }}">
<input type="text" class="form-control" name="nomealuno" value="{{ $matric->nomealuno }}">

para:

<input type="text" class="form-control" name="nomerespo[]" value="{{ $matric->nomedopai }}">
<input type="text" class="form-control" name="nomealuno[]" value="{{ $matric->nomealuno }}">

( Repare que os atributos name das tags foram alterados para um array, assim todos os campos serão enviados para o seu Controller, Caso a relação com Renovacao com usuário tenha sido definida e a propriedade $guarded ou $fillable estejam definidas em Renovacao poderá salvar o conteúdo com algo da forma: $user->renovacoes()->saveMany($dados) e o Laravel tratará da relação de chaves estrangeiras para você ).

No meu codigo está assim atualmente

//Controller

 public function store(RenovacaoRequest $request){


        $user = Auth()->user();

        $dados = $request->all();


        $renovacao = Renovacao::create($dados);
        $user->renovacao()->saveMany($dados);




        return view('dashboard.renovacao.confirmacao', compact ('renovacao'));
    }
7 respostas

// Por fim o Form

@foreach($matricula as $matric)
                    <div class="row">
                        <div class="col s6 m6">
                        <div class="input-field {{$errors->has('') ? 'has-error' : ''}} ">
                            <label for="produto">Nome do Pai:</label>
                            <input type="text" class="form-control" name="nomerespo[]" value="{{ $matric->nomedopai }}">

                        </div>
                        </div>

                        <div class="col s6 m6">
                        <div class="input-field {{$errors->has('') ? 'has-error' : ''}} ">
                            <label for="produto">Nome do Aluno(a):</label>
                            <input type="text" class="form-control" name="nomealuno[]" value="{{ $matric->nomealuno }}">

                        </div>
                        </div>




                    </div>
                    @endforeach

Oi Elyton, tudo bom?

Tenta dar uma debugada no valor que está sendo passado pro ::create e compartilha com a gente o resultado? Algo como:

public function store(RenovacaoRequest $request){

        $user = Auth()->user();

        $dados = $request->all();
    var_dump($dados);die();    
        $renovacao = Renovacao::create($dados);


        return view('dashboard.renovacao.confirmacao', compact ('renovacao'));
    }

Verifica se temos realmente um array disponível no request.

Olhando a estrutura do HTML não me parece ter nenhum problema. A ideia do array é bem famosa e muitos frameworks usam isso pra facilitar a reconstrução das instâncias a partir da view.

Como está sua classe Renovacao? Compartilha ela aqui também, assim fica mais fácil ter uma uma visão geral =)

Aguardo retorno.

Abraço

Opa, aqui está as classes renovação, user e as migration tbm rs

Só não entendo com array no form ele só recarrega a pagina quando quero salvar e quando eu tiro ele mostra os dados usando o dd($dados)

//Class Renovacao

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Renovacao extends Model
{
    protected $table = 'renovacao';
    protected $fillable = ['nomerespo','nomealuno','status'];
}

// Class user

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use App\Notifications\ResetPassword;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password','prematricula_id',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    public function matricula() {
            return $this->belongsTo('App\Matricula');
    }
}

//Migration User


<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

//Migration Renovacao

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateRenovacaoTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('renovacao', function (Blueprint $table) {
            $table->increments('id');
            $table->string('nomerespo');
            $table->string('nomealuno');
            $table->string('status')->default('pendente');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('renovacao');
    }
}

Conseguir fazer ele trazer tudo pro controller fazendo isso no request só nao consigo fazer ele salvar

Print do erro: https://prnt.sc/lndqw2

/// Código Renovaçãorequest


<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class RenovacaoRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function messages(){

        return [
            'nomerespo.required'=>'Informe o Nome do Responsável do Aluno',
            'nomealuno.required'=>'Informe o Nome do Aluno',

        ];
    }


    public function rules()
    {
        return [
            'nomerespo.*' => 'required|string|max:255', 
            'nomealuno.*' => 'required|string|max:255',

        ];
    }
}

Boa Elyton!

Acho que seu erro:

Argument passed .... must be of the type array, string given ...

Está relacionado a conversão do seus dados e o mapeamento delas com o banco de dados.

Na base, a gente ta definindo os campos como texto:

$table->string('nomerespo');
$table->string('nomealuno');    

Já que no banco o tipo array é mais limitado, você pode serializar os campos antes de enviar pro banco. Assim, no banco fica a string e na memória você consegue recuperar seu array =)

Então como ficaria o controller para salvar ??

Fiz essa alteração no form ele traz mais organizado os array

Print: http://prntscr.com/lnrplj

@foreach($matricula as $matric)
                    <div class="row">
                        <div class="col s6 m6">
                        <div class="input-field {{$errors->has('') ? 'has-error' : ''}} ">
                            <label for="produto">Nome do Pai:</label>
                            <input type="text" class="form-control" name="renovacao[{{ $loop->index}}][nomerespo]" value="{{ $matric->nomedopai }}">

                        </div>
                        </div>

                        <div class="col s6 m6">
                        <div class="input-field {{$errors->has('') ? 'has-error' : ''}} ">
                            <label for="produto">Nome do Aluno(a):</label>
                            <input type="text" class="form-control" name="renovacao[{{ $loop->index}}][nomealuno]" value="{{ $matric->nomealuno }}">

                        </div>
                        </div>




                    </div>
                    @endforeach

Eu estava vendo sobre forelse que coloca mensagem personaliza no foreach, eu testei só que nao deu certo ele cortava um dos registro que vinha no banco, e quando eu ajeitava os botao duplicava kkkk, como eu adiciono no blade o forelse e nao ter problema com duplicaçao do botao de salvar ? Bom a respeito a function store eu consegui resolver :D