Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Contagem de episódios

Boa noite

Para mostrar a quantidade de episódios em cada temporada, foi utilizado a função count(), até aí eu entendi. Mas no parâmetro '$temporada->episodios' foi ai que fiquei em dúvida, pois não teria que ser chamado com os parenteses no final, tipo assim: '$temporada->episodios()'?

Classe Temporada

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Temporada extends Model
{
    protected $fillable = ['numero_temporada'];
    public $timestamps = false;

    public function episodios()
    {
        return $this->hasMany(Episodio::class);
    }

    public function serie()
    {
        return $this->belongsTo(Serie::class);
    }
}

Abaixo: index.blade.php:

@extends('layout')

@section('cabecalho')
    Temporadas da série: {{ $serie->nome }}
@endsection

@section('conteudo')
    <ul class="list-group">
        @foreach ($temporadas as $temporada)
            <li class="list-group-item d-flex justify-content-between align-items-center">
                <a href="#">
                    {{ $temporada->numero_temporada }}
                </a>
                <span class="badge badge-secondary">
                    {{ $temporada->count($temporada->episodios) }}
                </span>
            </li>
        @endforeach
    </ul>
@endsection
1 resposta
solução!

Olá Leonardo,

Realmente isso confunde um pouco porque é parte da mágica do laravel.

Quando a gente chama com os parênteses estamos chamando a função criada, assim como retorno temos o objeto que representa a relação (um objeto da classe HasMany no seu exemplo). Podemos até utilizar esse objeto para criar uma query, exemplo: $temporada->episodios()->where('episodios.numero', '2')->get()

Já quando não utilizamos os parênteses, estamos acessando um atributo do model, é aí que está a mágica do laravel, ele percebe que estamos acessando uma atributo com o mesmo nome da função que define uma relação, então já busca esses dados no banco. Assim o retorno é uma collection com os models relacionados (no seu exemplo são os episódios que pertencem a temporada).


Juntando isso acima, quando chamamos o count assim: $temporada->episodios->count() estamos buscando todos os dados dos episódios relacionados com a temporada no banco dentro de uma collection, e então executamos o método count() da collection.

E quando executamos assim: $temporada->episodios()->count() estamos criando uma query que vai contar direto no banco o número de episódios relacionados a essa temporada.

São dois métodos count() diferentes nos exemplos acima, cada um com origem em uma classe diferente.


Obs.: No código da aula está:

{{ $temporada->episodios->count() }}

Mas no seu código acima ficou

{{ $temporada->count($temporada->episodios) }}

Espero ter ajudado, se ainda ficou alguma dúvida é só falar!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software