Como Retorna o valor do id

18 respostas
laravel
Elyton_Silva

Como retornar o valor do id no meu caso quero o email relacionado ao id do usuario - quero editar o email ele retorna o id

model usuario

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

model matricula

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Matricula extends Model {
protected $table = 'matricula';
protected $fillable = ['user_id','nomealuno','sexo','serieano','datanascimento'];


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

Controller que salva

public function store(MatriculaRequest $request)
{   

	if(Gate::denies('matricula-edit')){
        return view('dashboard.sempermissao');
    }
	
    $caminhos = [
        ['url'=>'/admin','titulo'=>'Tela Inicial'],
        ['url'=>route('matricula.index'),'titulo'=>'Matricula'],
        ['url'=>'','titulo'=>'Inscricao Realizada'],
        
    ];
    $user = Auth()->user();
    $user = User::where('email', $request->user_id)->get();
    if(isset($user)){
    $dados = $request->all();
    $dados['user_id'] = $user[0]->id;
    
    
    $matricula = Matricula::create($dados);
    
    //return'Cadastrado com Sucesso......';
    return view('dashboard.matricula.confirmacao');
    //return redirect('/admin/matricula')->with('info','Cadastro feito!');

      //dd($dados);
    }
}

Controller editar dados

public function edit($id) {
	if(Gate::denies('matricula-edit')){
        return view('dashboard.sempermissao');
    }
	
    $user = Auth()->user();
    $matricula = Matricula::find($id);
	
    return view('dashboard.matricula.editar',compact('matricula'));
}

Parte do form que deve mostrar o email

<div class="col s12 m12">
		<div class="input-field {{$errors->has('user_id') ? 'has-error' : ''}} ">
			<input type="text" name="user_id" class="validate" value="{{ isset($matricula->user_id)&& !old('user_id') ?  $matricula->user_id : '' }} {{old('user_id')}}">
			<label>Email de Inscrição</label>
			@if($errors->has('user_id'))
				<span class="red-text">
				    <text>{{$errors->first('user_id')}}</text>
				</span>
			@endif

		</div>
 </div>

Resultado dos dados

18 Respostas

Dragoon
  • A sua pergunta está sem sentido, o que você quer fazer?
  • Como quer fazer?
  • Com o que está tentando fazer?
Elyton_Silva
  • Quero trazer o email do id do usuário
  • Achando o email joga no campo do formulário
  • Eu estava tentando trazer da seguinte forma matricula->user->email

Os dados das 2 tabela só não estou conseguindo trazer os dado corretamente

Na tabela matricula a coluna user_id eu sei que o email é o [email removido] como eu faço agora pra jogar esse valor para o formulário ??

Dragoon

Arrume o seu relacionamento vide documentação

Relacionamentos:

<?php namespace App;

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

class User extends Authenticatable
{
    use Notifiable;
	
    protected $fillable = [
		'name',
		'email', 
		'password',
		'prematricula_id',
    ];
    protected $hidden = [
		'password', 
		'remember_token',
	];

    public function matricula() 
	{
        return $this->hasOne('App\Matricula', 'user_id', 'id');
    }
}

<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class Matricula extends Model 
{
	protected $table = 'matricula';
    public $incrementing = false; // não pode fazer auto incremento aqui
	protected $fillable = [
		'user_id',
		'nomealuno',
		'sexo',
		'serieano',
		'datanascimento'
	];


    public function user() 
	{
        return $this->belongsTo('App\User', 'user_id', 'id');
    }	
}

Carga antecipada é a melhor forma porque é otimizada então faça:

$matricula = Matricula::with('user')->where('id', $user_id)->first();
if ($matricula)  // encontrou a matricula
{
    $user = $matricula->user;
}

Com esse código você tem as informações da relação.

Um coisa que faltou dizer, quando a relação é 1 para 1 a tabela de User incrementa o id, já o user_id da Matricula recebe esse da tabela de User e user_id não é incrementado, mas, como?

$user = User::create([]);
if ($user) { //criou o usuário
    $matricula = new Matricula([]);
    $matricula->user()->associate($user);
    $matricula->save();
}

Observação: aonde está [] é o array associativo dos valores da sua view.

Elyton_Silva
$user = User::create([]);
if ($user) { //criou o usuário
    $matricula = new Matricula([]);
    $matricula->user()->associate($user);
    $matricula->save();
}

nessa parte do código ele não deixou abrir a view que vai cadastrar matricula

Dragoon

O erro é outro não tem nada a ver com o que eu falei para você o erro parece que o método está fora da chave, dá uma olhada no seu código.

Dragoon

cade a variável $user_id ???

Você tem que colocar a variavel correspondente ao valor do $id do usuário.

O que você mostrou é erros de codificação.

Elyton_Silva

Só coloquei o que vc sugeriu e mostrei o erro que aparece

Dragoon

Você tem que relacionar com o seu projeto, o $user_id é pra você saber que é o id do usuário de User que tem lá no parâmetro? se percebeu isso.

Elyton_Silva

Negócio acabou ficando mais estranho que eu pensei nesse caso dá para usar o join ?

Dragoon

se existe a forma de fazer explicada no site (e aqui no forum) não precisa fazer join e não tem muita lógica em fazer.

Qual é o problema? (eu vejo que você não tem tanta experiência e isso é normal)

Elyton_Silva

Problema é que não consegui resolver, vou deixar de lado essa opção por enquanto

Dragoon
  • Quando se faz um processo assim todos os campos das duas tabelas tem que estar no formulário

  • Tem que gravar uma para depois gravar o outro e o modelo que grava primeiro (User) tem chave auto incremento e essa chave é passada para a outra que não pode ser auto incremento (Matricula);

  • O método edit($id) tem o $id então você passa em:

    $matricula = Matricula::with('user')->where('id', $id)->first();
    

porque esse deve ser o $id tanto de usuário quanto de matricula.

É bom que você aprenda realmente e quebra a cabeça só assim que aprende mesmo, não desista jamais.

Elyton_Silva

No form atualizei

<div class="col s12 m12">
     <div class="input-field {{$errors->has('user_id') ? 'has-error' : ''}} ">
		 <input type="text" name="user_id" class="validate" value="{{ isset($matricula->user->email)&& !old('user_id') ?  $matricula->user->email : '' }} {{old('user_id')}}">
			 <label>Email de Inscrição</label>
			 @if($errors->has('user_id'))
			    <span class="red-text">
			           <text>{{$errors->first('user_id')}}</text>
			     </span>
			@endif

	 </div>
</div>

E o controller update o que coloco ?

public function update(MatriculaRequest $request, $id)
{
	if(Gate::denies('matricula-update')){
        return view('dashboard.sempermissao');
    }
    Matricula::find($id)->update($request->all());
    return redirect()->route('matricula.lista');
}

Dragoon

Você tem que guardar na tela um campo user_id para dar certo se ta passando o e-mail não vai mesmo… ! Email é no campo email e user_id respectivamente

Elyton_Silva

Como eu coloco ? é no controller ou na view estou nessa dúvida

Dragoon

Você está gravando dois models que fazem referencia a mesma chave primária correto?

Então na View:

  • name
  • email
  • password
  • prematricula_id (até aqui é a parte do user)
  • user_id
  • nomealuno
  • sexo
  • serieano
  • datanascimento (até aqui a parte da matricula)

Se você altera Matricula ligada em User a sua View deve ter todos esses elementos, além desses tem o campo id que é referente user_id então na sua view em alteração de dados precisa ter dois campos hidden

<input type="hidden" name="id" value="{{$id}}" />
<input type="hidden" name="user_id" value="{{$user_id}}" />

Ai você faz assim:


Código Inserção:

$data = $request->all();
$user = User::create($data['id']);
if  ($user)
{
    $matricula = new Matricula();
    $matricula->fill($data);
    $matricula->user()->associate($user);
    $matricula->save();
}

Código Alteração:

$data = $request->all();

$user = User::find($data['id']);
$user->fill($data);
$user->save();

$matricula = Matricula::find($data['user_id']);
$matricula->fill($data);
$matricula->save();

Acho que dai você consegue entender a relação 1 para 1 entre duas tabelas.

Tudo que é explicado é um base para você solucionar o seu problema.

Elyton_Silva

Você viu que eu tenho 2 função uma de edit que traz os dados para view e a outra função update que atualiza os dados

Dragoon

Estou te passando as duas formas de fazer o insert e o update!

Agora é com você, eu não consigo dar manutenção no seu código e independente se eu vi ou não já te dei duas resposta pronta, só precisa adaptar-se ao seu código.

Você precisa estudar mais um pouquinho está faltando isso, e estudar primeiro o PHP e depois utilizar um Framework que Laravel está ficando dificil com o passar das versões, mas, esse recurso existe desde a primeira versão.

Criado 19 de fevereiro de 2019
Ultima resposta 21 de fev. de 2019
Respostas 18
Participantes 2