TransWikia.com

Como passar objetos de métodos que estão em controllers diferentes no Laravel?

Stack Overflow em Português Asked by Willians Macena on November 5, 2021

Boa noite.

O que eu preciso é exibir o nome do livro onde está o seu id (na coluna Livro do form).
inserir a descrição da imagem aqui
E para que eu não faça de uma maneira fora da convenção, gostaria de saber a maneira correta de fazer isso.

Tenho o método painel que está no controller HomeController que passa para minha view os objetos abaixo para formar a table:

    public function painel(){
        $livro = Livro::all();
        $lote = Lote::all();
        $status = Status::all();
        return view('painel.index', compact('livro', 'lote', 'status'));
        
    }

E também tenho o controller LoteController onde de lá eu precisaria passar pra essa mesma view ‘painel.index’ o nome do livro (livro->titulo) e não o id do livro que está na tabela de Lote (lote->livro_id).

Gostaria de saber qual a maneira correta para fazer tal procedimento. Se caso eu estiver errado na forma que estou fazendo, estou livre para aceitar as críticas para assim melhorar o meu código. Obrigado!

View painel.index:

div class="container">
    <h1>Consulta de Lotes</h1>
    <table class="table">
        <thead class="thead-dark">
            <tr>
                <th>Lote</th>
                <th>Livro</th>
                <th>Data Início</th>
                <th>Data de Encerramento</th>
            </tr>
        </thead>
        <tbody>
            

            @foreach ($lote as $lotes)
                <tr>
                    <th>{{ $lotes->id }}</th>
                    <th>{{ $lotes->livro_id }}</th>
                    <th>{{ $lotes->dia_inicio }}</th>
                    <th>{{ $lotes->dia_fim }}</th>

                </tr>
            @endforeach
        </tbody>
    </table>
</div>

2 Answers

Se na sua migration de livros você criou o livro_id como chave estrangeira referenciando a tabela livros, basta vc criar o relacionamento no modelo lote e usar o relacionamento em qualquer lugar do sistema que vc precisar.

Na migration da tabela de lotes:

$table->unisignedInteger('livro_id');
$table->foregin('livro_id')->references('id')->on('livros')->onDelete('cascade');

Checa de o seu ID de livros foi criado com Integer ou BigInteger, a chave estrangeira tem que ser do mesmo tipo só que unsigned

No modelo de Lotes

public function livro() {
   return $this->hasOne(Livro::class);
}

Depois, no controller que vc precisar vc faz a consulta:

$lotes = Lotes::with(['livro'])->get(); // o with aqui é opcional, vai evitar que na view o laravel faça outra consulta no banco
return view('painel.index', ['lotes' => $lotes]);

Na view

@foreach ($lotes as $lote)
<tr>
   <td>{{ $lote->id }}</td>
   <td>{{ $lote->livro->titulo }}</td> // se este for o compo da tabela livros que vc quer
   <td>{{ $lotes->dia_inicio }}</td>
   <td>{{ $lotes->dia_fim }}</td>
</tr>
@endforeach

Eu escrevi o código aqui e agora, pode ter algum errinho, mas, a ideia é essa...

Você ainda pode no modelo de livros ter um método que retorna todos os lotes usando hasMany (acho que é isso)

Answered by Luiz Lapetina on November 5, 2021

Pode fazer um join na consulta, exemplo:

$users = DB::table('users')
            ->join('contacts', 'users.id', '=', 'contacts.user_id')
            ->join('orders', 'users.id', '=', 'orders.user_id')
            ->select('users.*', 'contacts.phone', 'orders.price')
            ->get();

Answered by Munareto on November 5, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP