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

Retornar a quantidade de episódios na temporada

Tenho os seguintes códigos:

Rota:

Route::get('/temporadas/{temporada}/episodios', 'EpisodiosController@index');

ModelTemporada:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

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

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

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

ControllerEspisodios:

<?php

namespace App\Http\Controllers;

use App\Temporada;
use Illuminate\Http\Request;

class EpisodiosController extends Controller
{
    public function index(Temporada $temporada)
    {
        $episodios = $temporada->episodios;

        return view('episodios.index', compact('episodios'));
    }
}

Minha dúvida é: porque o código é:

$episodios = $temporada->episodios;

ao invés de :

$episodios = $temporada->episodios();

uma vez que o o episódio é um método dentro da classe temporada?

1 resposta
solução!

Fala, Rodrigo!

Excelente pergunta.

O Laravel age de formas misteriosas... hahaha

Por baixo dos panos o que tá acontecendo é uma chamada ao método mágico __get do PHP, que com a implementação do Laravel, indentifica que existe a relação através do método com o mesmo nome da propriedade acessada, e com isso consegue buscar no banco os dados.

Se você acessar com $temporada->episodios() vai ter uma instância de um relacionamento, e não a coleção de episódios que é o que queremos.

Se você me perguntar: "Vinicius, mas deixar esse comportamento tão escondido é uma boa ideia?" Eu vou responder: "Na minha opinião, não!"

Eu discordo de algumas (várias) decisões de design do Laravel, mas é assim que ele funciona.

Espero não ter te confundido ainda mais e conseguido sanar sua dúvida.

Forte abraço e bons estudos!