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.