[PROMOÇÃO] Assine com + 30% de desconto ANUAL MENSAL (últimas horas)
Albert Reis da Cruz
Criador Albert Reis da Cruz 10/01/2022

Possuo um relacionamento entre user e sheets (1:n), preciso pegar o último registro, estou fazendo desta forma: $user->sheets->last();

agora preciso editar um valor desta collection e não consigo.

meu código:

if (!$user->sheets->last()) {

            $data['in'] = $date;                
            $data['status'] = "1";
            $user->sheets()->create($data);

        } else {

            foreach ($user->sheets->last() as $sheet) {
                if ($sheet['status'] == "1") {
                    $data['rest_out'] = $date;
                    $data['status'] = "2";
                    $user->sheets()->update($data);

                } else if ($sheet['status'] == "2") {
                    $data['rest_in'] = $date;
                    $data['status'] = "3";
                    $user->sheets()->update($data);

                } else if ($sheet['status'] == "3") {
                    $data['out'] = $date;
                    $data['status'] = "4";
                    $user->sheets()->update($data);

                } else if ($sheet['status'] == "4") {
                    $data['in'] = $date;                // registra entrada do funcionário.
                    $data['status'] = "1";
                    $user->sheets()->create($data);

                }

            }
Manager Carlos Ferreira 10/01/2022

Olá, Albert!
Tudo bem?

Poderia recuperar com first:
$sheet = $user->sheets->orderBy('id', 'DESC')->first();

Carlos Ferreira
Criador Albert Reis da Cruz 10/01/2022

Não foi.

BadMethodCallException

Method Illuminate\Database\Eloquent\Collection::orderBy does not exist.
 
Albert Reis da Cruz
Manager Carlos Ferreira 10/01/2022

Desculpa, faltou o (): $sheet = $user->sheets()->orderBy('id', 'DESC')->first();

Carlos Ferreira
Criador Albert Reis da Cruz 10/01/2022

fiz assim: $sheet = DB:table('sheets')->where('usr_id', $id)->orderBy('id', 'DESC')-first();

tem alguma diferença?

 

Albert Reis da Cruz
Criador Albert Reis da Cruz 10/01/2022

Agora tem como fazer desta forma?

$users= $this->repository-where('role_id', '2')->paginate();

e juntar com essa?

 

$sheet = $user->sheets()->orderBy('id', 'DESC')->first();

 

trazer todos os usuários e a ultima sheet de cada um?

 

Albert Reis da Cruz
Manager Carlos Ferreira 10/01/2022

Quando usa a facade DB está usando o Query Builder, e quando usa o Model está usando o Eloquent (que usa o query builder por baixo dos panos) - a vantagem do Eloquent é que ele é super poderoso, tem recursos que facilitam demais.

---

Já sobre a sua segunda pergunta, você consegue unificar elas em uma única consulta, uma das formas é usar ao máximo so recursos de relacionamentos de tabelas que o Eloquent dispõe.

Recomendo que assista este curso: https://academy.especializati.com.br/curso/laravel-banco-de-dados-relacional

Carlos Ferreira
Criador Albert Reis da Cruz 10/01/2022

Obrigado!

Albert Reis da Cruz
Criador Albert Reis da Cruz 10/01/2022

Carlos, olá, tudo blz?

Assisti sua recomendação. Agregou muito!

No entanto não consegui solucionar o problema, inclusive verfiquei a documentação oficial tb.

gostaria de um "empurraozinho", rsrs

vou utilizar ela no método index.

Gratidão.

Albert Reis da Cruz
Manager Carlos Ferreira 10/01/2022

Como está o seu código atualmente? E onde você travou?
Mostra aí que te dou uma força! =D

Carlos Ferreira
Criador Albert Reis da Cruz 10/01/2022
 
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $users = $this->repository->with('sheets')->where('role_id', '<>', '2')->paginate();

        // dd($users);

        return view('admin.pages.users.index', compact('users'));
    }
Albert Reis da Cruz
Manager Carlos Ferreira 10/01/2022

No seu método with você pode passar um array, e aplicar filtros nos itens relacionados, exemplos

Sem filtros:
$users = $this->repository
                ->with(['sheets', 'outro_relacionamento'])
                ->paginate();

// Filtrando os relacionamentos
$filter = '12';
$users = $this->repository
                ->with(['sheets' => function ($query) use ($filter) {
                    $query->where('colunaA', '!=', $filter);
                })
                ->paginate();

Na dúvida da query final, instale o Telescope, ou mesmo troque o paginate() por toSql()

Carlos Ferreira
Criador Albert Reis da Cruz 10/01/2022

bom dia, onde fecho o colchete no exemplo onde filtra os relacionamentos? Ele foi aberto antes do 'sheets'.

Está dando um erro.

Albert Reis da Cruz
Criador Albert Reis da Cruz 10/01/2022

fiz assim:

$users = User::with(['sheets' => function ($query) {

      $query->where('status', '4');

}])->toSql();

dd($users);

e recebi isso:

"select * from `users`"

este exemplo acima tirei da documentação oficial.

Albert Reis da Cruz
Manager Carlos Ferreira 10/01/2022

Usa o Telescope, porque ele vai te dar uma visão full da query: https://academy.especializati.com.br/aula/instalar-telescope-e-debugbar

Carlos Ferreira
Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!