Laravel #3: O Eloquent ORM

Laravel #3 - O Eloquent ORM

O terceiro episódio da serie de Laravel, vou apresentar o ORM. Esta “tecnica” tem sido cada vez mais utilizada nos ultimos anos. O aumento do uso do ORM, vem derivado ao facto de muitos developers não se sentirem a vontade a escrever código SQL, e mesmo pelo própria produtividade que o uso deste método representa.

O que é o ORM?

ORM significa Object Relational Mapper, e consiste no mapeamento do objecto relacional, permintindo fazer uma relação dos objectos com os dados que os mesmos representam.

No Laravel, o Eloquent ORM representa exatamente isto.

O Eloquent ORM

O Eloquent ORM faz parte do Laravel, e é uma das mais poderosas ferramentas dentro desta fantástica framework. Permitindo um simples implementação do ActiveRecord Pattern, para interegir com a Base de Dados, por meio de “modelos”. Cada modelo do eloquent, cria um wrapper sobre uma determinada tabela da base de dados a qual está associado. Desta forma, cada Model torna-se uma reperesentação da sua tabela, podendo assim criar relações com outras tabelas (usando outros models), aceder a sua informação de uma forma bastante mais simples e limpa, do que (re)escrever as linhas de SQL.

O Eloquent ORM, tem “accessors methods” e propriedades que correspondem as colunas de cada entrada da tabela correspondente.

Com estes modelos, não só as operações de acesso estão disponiveis. Utilizando o Eloquent ORM, podemos também através do modelo, fazer actualização de conteúdo dentro das tabelas, tal como apagar as mesmas.

Exemplos de Eloquent ORM

Esta ferramenta e extremamente completa e vasta. Existem muitas coisa que são possiveis de fazer, e principalmente vai ajudar-vos a poupar um bom tempo nos vossos desenvolvimentos.

Proibir actualizações

Quando por algum motivo, uma das tabelas do teu projecto não pode ser actualizada, ou alterada de alguma forma, podes usar o código abaixo.

class Client extends Eloquent
{
    protected static function boot()
    {
        parent::boot();
        static::updating(function($model)
        {
            return false;
        });
    }
}

Validação automática do modelo

Existe também a possibilidade de validar automaticamente o modelo, quando este recebe informação da adicionar uma entrada ou actualizar dados. Usando os eventos do modelo, podemos validar essa informação, de forma a permitir ou não a continuação da operação.

class Client extends Eloquent
{
    public static $autoValidate = true;
    protected static $rules = [];
    protected static function boot()
    {
        parent::boot();
        static::saving(function($model)
        {
            if ($model::$autoValidate) {
                return $model->validate();
            }
        });
        // or static::creating, or static::updating
    }
    public function validate()
    {
    }
}

Relações condicionais

Possivelmente o que é mais utilizado no Eloquent. Fazer relações entre tabelas é algo extremamente comum, e esta ferramenta aborda esta necessidade de uma forma muito simples. Dominando o Eloquent ORM, fazer relações de várias formas vai-se tornando bastante pratico. Segue um exemplo:

class Client extends Model
{
    public function category()
    {
        return $this->belongsTo('Card', 'card_id')
            ->where('user_id', Auth::user()->id);
    }
}

Recolher dados usando o modelo

Como falei mais acima, os modelos permitem usar muitas operações. Neste exemplo, podemos ver como fazer uma pesquisa numa tabela. No caso, apenas usando um “where” para filtrar a informação que pretendemos:

$users = User::where('partner_id', '=', 3)->get();
$users = User::where('partner_id', 3)->get();

Na primeira linha, utilize o ‘=’, mas quando temos uma operação que procuramos um valor igual a algo, não precisamo de adicionar o mesmo, como está representado na segunda linha.

Para o exemplo de querer procurar um falor superior a algo, devemos fazer o seguinte:

$users = User::where('partner_id', '>', 3)->get();

Se tiveres o objectivo de pesquisar por uma data, o Eloquent ORM dá-te também uma alternativa mais simples, para além do “where”.

$q->whereDate('created_at', date('Y-m-d'));
$q->whereDay('created_at', date('d'));
$q->whereMonth('created_at', date('m'));
$q->whereYear('created_at', date('Y'));

Utilizar o UUID

O Eloquent ORM também oferece ferramentas para sistemas de Multitenancy (multiplas bases de dados). Podes usar o UUID como chave primária, se assim preferires. Para isso basta instalar um pacote e criação de uma Trait. Se não conheces as Traits, tens um artigo no nosso blog sobre o PHP: Traits (https://blog.coredesignz.com/2020/05/25/php-traits/) da serie de PHP.

use Ramsey\Uuid\Uuid;

trait UUIDModel
{
    public $incrementing = false;
    protected static function boot()
    {
        parent::boot();
        static::creating(function ($model)
        {
            $key = $model->getKeyName();
            if (empty($model->{$key})) {
                $model->{$key} = (string) $model->generateNewUuid();
            }
        });
    }
    public function generateNewUuid()
    {
        return Uuid::uuid4();
    }
}

Conclusão

O Laravel é uma framework (link para o artigo das frameworks) muito completa, que te pode dar uma grande vantagem durante o desenvolvimento, tal como falamos no artigo Laravel #1: O Conceito (link).

Para futuras referências, todos os código deste artigos, e futuros artigos, estarão disponíveis na minha conta de Github. Podem usar todo o código de forma totalmente gratuita, e para os fins que entenderem.

Mais desta serie

Continua a acompanhar a nossa serie sobre Laravel. Acompanha a página no Facebook, para ficares sempre a par das novidades sobre esta e outras serie, produtos, entre outros temas.

Podes também ver todos os código que disponibilizo aqui no blog, entre outras coisas, na minha página no Github.