Método for não funciona no controller usando Laravel

Bom, estou com uma dificuldade, o método for não funciona dentro do meu controller… segue o código a baixo.

public function store(Request $request){
    $validator  = $this->validarProduto($request);
    if($validator->fails()){
        return redirect()->back()->withErrors($validator->errors());
    }        
    $dados = [

        'descricao'   => $request->descricao,
        'insumo_id'   => $request->insumo_id,
        'quantidade'  => $request->quantidade,

    ];

    for ($i=0; $i < count($dados['insumo_id']); $i++) { 
    
        $produto = Produto::create($dados);
        $produto = Produto::find($produto->id);
        $produto->insumos()->attach($dados['insumo_id'], ['quantidade' => $dados['quantidade'][$i]]);
    
    }
    
    $redirect = redirect()->route('produto.index');
    return $redirect->with('success', 'produto adicionado com sucesso!!!');
}

Primeiro não funciona porque aparece algum erro?
Segundo o $dados['insumo_id'] é um array?

Para ter uma resposta precisa dos modelos, da View também .

$dados[‘insumo_id’ é um array, o loop não incrementa.

Vou postar aqui como tá o meu projeto.

public function store(Request $request){

    $validator  = $this->validarProduto($request);

    if($validator->fails()){
    return redirect()->back()->withErrors($validator->errors());
    }
    
    $dados = [

        'descricao'   => $request->descricao,
        'insumo_id'   => $request->insumo_id,
        'quantidade'  => $request->quantidade,

    ];



        for ($i=0; $i < count($dados['insumo_id']); $i++) { 
    
            $produto = Produto::create($dados);
            $produto = Produto::find($produto->id);
            $produto->insumos()->attach($dados['insumo_id'], ['quantidade' => $dados['quantidade'][$i]]);

    }

    
    $redirect = redirect()->route('produto.index');
    return $redirect->with('success', 'produto adicionado com sucesso!!!');
}
identar texto pre-formatado em 1 espaços <?php

namespace App\Model;

use Illuminate\Database\Eloquent\Model;
use App\Model\Insumo;

class Produto extends Model
{
protected $fillable = [

    'descricao',

                      ];

public $timestamps = false;

  public function insumos(){

     return $this->belongsToMany("App\Model\Insumo", 'produto_insumo','produto_id','insumo_id')->withPivot(['quantidade']);
                    
}

}

identar texto pre-formatado em 4 espaços <?php

namespace App\Model;

use Illuminate\Database\Eloquent\Model;
use App\Model\Produto;

class Insumo extends Model
{
protected $fillable = [

    'descricao',
    'unidade',
    'valor_unit',
    
                      ];

public function produtos(){

return $this->belongsToMany("App\Model\Produto", 'produto_insumo','insumo_id','produto_id')->withPivot(['quantidade']);

}
}

identar @extends('adminlte::page')

@section(‘title’, ‘Locktec - Proposta’)

@section(‘content_header’)

@stop

@section(‘content’)

Adicionar novo produto

</div>
  
<div class="box-body">
<div class="col-lg-4 col-xs-12">

@foreach($errors->all() as $error)
<div class="callout callout-danger">
      {{ $error }}
</div>      
 @endforeach

<form action="" method ="POST" id="form_prepare">
     <fieldset>
<div class="form-group">

<label for="descircao">Descrição</label>
<input type="text" name="descricao" id="descricao"  placeholder="Insira a descrição do produto" class="form-control" required>
</div>

<div class="form-group">
<label for="insumo_id[]">Insumo</label>
<select class="form-control"  name="insumo_id[]" required>
<option value=""> -- Selecione um insumo -- </option>
@foreach($insumos as $insumo)
    <option value="{{$insumo->id}}">{{$insumo->descricao}}</option>
@endforeach
</select>

</div>

<div class="form-group">    

<label for="quantidade">Quantidade</label>
<input type="number" name="quantidade[]" id="quantidade[]"  placeholder="Insira a quantidade desejada" class="form-control" required>
</div>

<hr>
<div class="form-group">
<button type="submit"  class="btn btn-primary">Adicionar</button>
    </fieldset>
</form>
<hr>
    <table id="grid" class= "table-responsive table table-striped table-bordered table-hover">
		<thead>
			<tr>
				<th>Produto</th>
				<th>Insumo Descr.</th>
				<th>Quantidade</th>
			</tr>
		</thead>
 		<tbody>
		</tbody>
	</table><!-- /grid -->
    <form action="{{route('produto.store')}}" method="POST" id="form_insert">
		<fieldset style="display: none;"></fieldset>
        {!! csrf_field() !!}
        <div class="form-group">
		<button type="submit"  class="btn btn-success">Cadastrar</button>
        <div>
	</form><!-- /form_insert -->


    </div>

 
</div>
<script type="text/javascript">
  $(document).ready(function(){
$('#form_prepare').submit(function(){
	var $this = $( this );

	var descricao = $this.find("input[name='descricao']").val(),
		insumo_id = $this.find("select[name='insumo_id[]']").val(),
		quantidade = $this.find("input[name='quantidade[]']").val();

	var tr = '<tr>'+
		'<td>'+descricao+'</td>'+
		'<td>'+insumo_id+'</td>'+
		'<td>'+quantidade+'</td>'+
		'</tr>'
	$('#grid').find('tbody').append( tr );

	var hiddens = '<input type="hidden" name="descricao" value="'+descricao+'" />'+
		          '<input type="hidden" name="insumo_id[]" value="'+insumo_id+'" />'+
		          '<input type="hidden" name="quantidade[]" value="'+quantidade+'" />';

	$('#form_insert').find('fieldset').append( hiddens );

	return false;
});

});

@stop

Aproveitando o tópico, para que serve : ->
é um símbolo de atribuição?

A seta (arrow) serve para você acessar os atributos/métodos da classe

1 curtida

Amigos, consegui resolver o problema!!! :grinning: