Classe de modelo Eloquent
Nesta página
- Visão geral
- Definir uma classe de modelo Eloquent
- Estenda o modelo autenticavel
- Personalizar uma classe de modelo Eloquent
- Alterar o nome da coleção de modelos
- Alterar o campo de chave primária
- Habilitar exclusões suaves
- Converter tipos de dados
- Personalizar Atribuição em Massa
- Estender classes de modelo de terceiros
- Exemplo de classe estendida
- Especifique o comportamento de remoção
- Exemplo executável
- Exemplo executável em massa
- Criar um esquema de modelo versionado
- Exemplo de versionamento de esquema
Visão geral
Este guia mostra como usar o pacote Laravel MongoDB para definir e personalizar modelos Laravel Eloquent. Você pode usar esses modelos para trabalhar com dados do MongoDB usando o mapeador relacional de objetos (ORM) do Laravel Eloquent.
As seções a seguir explicam como adicionar comportamentos ORM do Laravel Eloquent aos modelos do Laravel MongoDB:
Definir uma classe de modelo Eloquent demonstra como criar uma classe de modelo.
Extend the Authenticatable Model mostra como definir o MongoDB como o provedor do usuário de autenticação.
Personalizar uma classe de modelo Eloquent explica várias personalizações de classe de modelo.
Estender classes de modelo de terceiros explica como tornar as classes de modelo de terceiros compatíveis com o MongoDB.
Especificar Comportamento de Poda mostra como remover periodicamente os modelos que você não precisa mais.
Criar um esquema de modelo versionado mostra como implementar o controle de versão do esquema do modelo.
Definir uma classe de modelo Eloquent
Modelos Eloquent são classes que representam seus dados. Elas incluem métodos que executam operações do banco de dados, como inserções, atualizações e exclusões.
Para declarar um modelo Laravel MongoDB, crie uma classe no diretório app/Models
do seu aplicativo Laravel que estenda o MongoDB\Laravel\Eloquent\Model
como mostrado no seguinte exemplo de código:
namespace App\Models; use MongoDB\Laravel\Eloquent\Model; class Planet extends Model { }
Por padrão, o modelo usa o nome do banco de banco de dados MongoDB definido na configuração config/database.php
do aplicativo Laravel e a forma plural de snake case do nome da classe do modelo para a coleção.
Este modelo é armazenado na coleção planets
MongoDB.
Dica
Como alternativa, use o console artisan
para gerar a classe de modelo e alterar a importação Illuminate\Database\Eloquent\Model
para MongoDB\Laravel\Eloquent\Model
. Para saber mais sobre o artisan
console do , consulte Console do Mestre nos do Docs Laravel.
Para saber como especificar o nome do banco de dados de dados usado pelo seu aplicação Laravel, Configure sua conexão com o MongoDB .
Estenda o modelo autenticavel
Para configurar o MongoDB como o provedor de usuário do Laravel, você pode estender a classe MongoDB MongoDB\Laravel\Auth\User
do Laravel. O seguinte exemplo de código mostra como estender esta classe:
namespace App\Models; use MongoDB\Laravel\Auth\User as Authenticatable; class User extends Authenticatable { }
Para saber mais sobre como personalizar um fornecedor de usuário de autenticação do Laravel, consulte Adicionar fornecedores de usuário personalizados nos do Docs Laravel.
Personalizar uma classe de modelo Eloquent
Esta seção mostra como executar as seguintes personalizações de comportamento do modelo Eloquent:
Alterar o nome da coleção de modelos
Por padrão, o modelo usa a forma plural de snake case do seu nome de classe de modelo. Para alterar o nome da collection que o modelo utiliza para recuperar e salvar dados no MongoDB, substitua a propriedade $collection
da classe de modelo.
Observação
Recomendamos usar o comportamento de nomenclatura de coleção padrão para manter as associações entre modelos e coleções diretas.
O exemplo a seguir especifica o nome da collection MongoDB customizada, celestial_body
, para a classe Planet
:
namespace App\Models; use MongoDB\Laravel\Eloquent\Model; class Planet extends Model { protected $collection = 'celestial_body'; }
Sem substituir a propriedade $collection
, este modelo mapeia para a coleção planets
. Com a propriedade substituída , a classe de exemplo armazena o modelo na coleção celestial_body
.
Alterar o campo de chave primária
Para personalizar o campo de chave primária do modelo que identifica exclusivamente um documento MongoDB, substitua a propriedade $primaryKey
da classe de modelo.
Por padrão, o modelo usa o driver PHP MongoDB para gerar ObjectIDs exclusivos para cada documento que seu aplicação Laravel insere.
O exemplo seguinte especifica o campo name
como a chave primária para a classe Planet
:
namespace App\Models; use MongoDB\Laravel\Eloquent\Model; class Planet extends Model { protected $primaryKey = 'name'; }
Para saber mais sobre o comportamento da chave primária e as opções de personalização, consulte Chaves primárias do Eloquent nos do Docs Laravel.
Para saber mais sobre o _id
campo , ObjectIDs e a MongoDB estrutura do documento ,consulte Documentos nos do MongoDB servidor Docs.
Habilitar exclusões suaves
O Eloquent inclui um recurso de exclusão suave que altera o comportamento do método delete()
em um modelo. Quando a exclusão reversível está ativada em um modelo, o método delete()
marca um documento como excluído em vez de removê-lo do banco de dados. Ele define um carimbo de data/hora no campo deleted_at
para excluí-lo automaticamente das operações de recuperação.
Para habilitar exclusões suaves em uma classe, adicione o traço MongoDB\Laravel\Eloquent\SoftDeletes
como mostrado no seguinte exemplo de código :
namespace App\Models; use MongoDB\Laravel\Eloquent\Model; use MongoDB\Laravel\Eloquent\SoftDeletes; class Planet extends Model { use SoftDeletes; }
Para saber mais sobre os métodos que você pode executar em modelos com as exclusões suaves ativadas, consulte Exclusão suave do Eloquent nos do Docs Laravel.
Converter tipos de dados
O Eloquent permite converter tipos de dados de atributo do modelo antes de armazenar ou recuperar dados usando um auxiliar de conversão. Esse auxiliar é uma alternativa conveniente para definir métodos acessadores e mutadores equivalentes em seu modelo.
No exemplo a seguir, o auxiliar de fundição converte o discovery_dt
atributo de modelo , armazenado no MongoDB como MongoDB\BSON\UTCDateTime tipo para o datetime
tipo Laravel .
namespace App\Models; use MongoDB\Laravel\Eloquent\Model; class Planet extends Model { protected $casts = [ 'discovery_dt' => 'datetime', ]; }
Dica
Lança em Laravel 11
No Laravel 11, você pode definir um método casts()
para especificar conversões de tipo de dados em vez de utilizar o atributo $casts
. O código a seguir executa a mesma conversão do exemplo anterior usando um método casts()
:
protected function casts(): array { return [ 'discovery_dt' => 'datetime', ]; }
Para saber mais, consulte Fundição de Atributo na documentação do Laravel.
Esta conversão permite que você use o PHP DateTime ou a classe MongoDB para trabalhar com datas neste campo. O exemplo a seguir mostra uma query do Laravel que usa o auxiliar de conversão no modelo para fazer a query de planetas com um discovery_dt
de menos de três anos atrás:
Planet::where( 'discovery_dt', '>', new DateTime('-3 years'))->get();
Para saber mais sobre MongoDB os tipos de dados do , consulte nos BSON types do MongoDB servidor Docs.
Para saber mais sobre o auxiliar de conversão do Laravel e os tipos suportados, consulte Fundição de Atributos nos do Docs Laravel.
Personalizar Atribuição em Massa
O Eloquent permite criar vários modelos e seus dados de atributo passando uma array de dados para o método de modelo create()
. Este processo de inserção de vários modelos é chamado de atribuição em massa.
A atribuição em massa pode ser uma maneira eficiente de criar vários modelos. No entanto, ele pode expor uma vulnerabilidade de segurança explorável. Os dados nos campos podem conter atualizações que levam a permissões ou acesso não autorizados.
O Eloquent fornece as seguintes características para proteger seus dados de vulnerabilidades de atribuição em massa:
$fillable
contém os campos que são graváveis em uma atribuição em massa$guarded
contém os campos que são ignorados em uma atribuição em massa
Importante
Recomendamos usar $fillable
em vez de $guarded
para se proteger contra vulnerabilidades. Para saber mais sobre essa recomendações, consulte a Versão de segurança: Laravel 6.18.35, 7.24.0 artigo no site Laravel.
No exemplo seguinte, o modelo permite a atribuição em massa dos campos utilizando o atributo $fillable
:
namespace App\Models; use MongoDB\Laravel\Eloquent\Model; class Planet extends Model { protected $fillable = [ 'name', 'gravitational_force', 'diameter', 'moons', ]; }
O seguinte exemplo de código mostra a atribuição em massa do modelo Planet
:
$planets = [ [ 'name' => 'Earth', 'gravitational_force' => 9.8, 'day_length' => '24 hours' ], [ 'name' => 'Mars', 'gravitational_force' => 3.7, 'day_length' => '25 hours' ], ]; Planet::create($planets);
Os modelos salvos no banco de dados contêm somente os campos name
e gravity
, pois day_length
é omitido do atributo $fillable
.
Para saber como alterar o comportamento ao tentar preencher um campo omitido da $fillable
array , consulte Exceções de atribuição de massa nos do Docs Laravel.
Estender classes de modelo de terceiros
Você pode usar o Laravel MongoDB para estender uma classe de modelo de terceiros incluindo a traça DocumentModel
ao definir sua classe de modelo. Ao incluir esta funcionalidade, você pode tornar a classe de terceiros compatível com o MongoDB.
Ao aplicar a funcionalidade DocumentModel
a uma classe de modelo, você deve declarar as seguintes propriedades em sua classe:
$primaryKey = '_id'
, porque o campo_id
identifica exclusivamente documentos MongoDB$keyType = 'string'
, porque o Laravel MongoDB converte valores do MongoDBObjectId
para o tipostring
Exemplo de classe estendida
Este exemplo cria uma classe de modelo Planet
que estende a classe CelestialBody
de um pacote chamado ThirdPartyPackage
. A classe Post
inclui a traço DocumentModel
e define propriedades, incluindo $primaryKey
e $keyType
:
namespace App\Models; use MongoDB\Laravel\Eloquent\DocumentModel; use ThirdPartyPackage\CelestialBody; class Planet extends CelestialBody { use DocumentModel; protected $fillable = ['name', 'diameter']; protected $primaryKey = '_id'; protected $keyType = 'string'; }
Depois de definir sua classe, você pode realizar as operações do MongoDB como de costume.
Dica
Para ver outro exemplo que usa o traço DocumentModel
, consulte a seção Laravel Sanctum do guia de autenticação do usuário.
Especifique o comportamento de remoção
O Eloquent permite especificar critérios para excluir periodicamente dados do modelo que você não precisa mais. Quando você agenda ou executa o comando model:prune
, o Laravel chama o método prunable()
em todos os modelos que importam as características Prunable
e MassPrunable
para corresponder aos modelos para exclusão.
Para utilizar esta funcionalidade com modelos que utilizam MongoDB como banco de dados, adicione a importação apropriada ao seu modelo:
MongoDB\Laravel\Eloquent\Prunable
opcionalmente, executa uma etapa de limpeza antes de excluir um modelo que corresponda aos critériosMongoDB\Laravel\Eloquent\MassPrunable
exclui modelos que correspondem aos critérios sem buscar os dados do modelo
Observação
Ao ativar exclusões suaves em um modelo consultável em massa, você deve importar os seguintes pacotes do Laravel MongoDB :
MongoDB\Laravel\Eloquent\SoftDeletes
MongoDB\Laravel\Eloquent\MassPrunable
Para saber mais sobre o recurso de remoção, consulte Modelos de Remoção nos do Docs Laravel.
Exemplo executável
A classe de podação a seguir inclui um método prunable()
que corresponde aos modelos que a ação de podar exclui e um método pruning()
que é executado antes de excluir um modelo correspondente:
namespace App\Models; use MongoDB\Laravel\Eloquent\Model; use MongoDB\Laravel\Eloquent\Prunable; class Planet extends Model { use Prunable; public function prunable() { // matches models in which the solar_system field contains a null value return static::whereNull('solar_system'); } protected function pruning() { // Add cleanup actions, such as logging the Planet 'name' attribute } }
Exemplo executável em massa
A seguinte classe prunable em massa inclui um método prunable()
que corresponde a modelos que a ação de podar exclui:
namespace App\Models; use MongoDB\Laravel\Eloquent\MassPrunable; use MongoDB\Laravel\Eloquent\Model; class Planet extends Model { use MassPrunable; public function prunable() { // matches models in which the gravitational_force field contains // a value greater than 0.5 return static::where('gravitational_force', '>', 0.5); } }
Criar um esquema de modelo versionado
Você pode implementar um padrão de versionamento de esquema em seu aplicação usando a traça HasSchemaVersion
em um modelo Eloquent. Você pode optar por implementar uma versão do esquema para organizar ou padronizar uma collection que contém dados com esquemas diferentes.
Dica
Para saber mais sobre o versionamento de esquema, consulte o tutorial Dados de modelo para versionamento de esquema no manual do servidor.
Para utilizar esta funcionalidade com modelos que utilizam MongoDB como banco de banco de dados, adicione a importação MongoDB\Laravel\Eloquent\HasSchemaVersion
ao seu modelo. Em seguida, defina a constante SCHEMA_VERSION
como 1
para definir a primeira versão do esquema na sua collection. Se sua coleção desenvolver para conter vários esquemas, você poderá atualizar o valor da constante do SCHEMA_VERSION
nas classes de modelo subsequentes.
Ao criar seu modelo, você pode definir o método migrateSchema()
para especificar uma migração para a versão atual do esquema ao recuperar um modelo. Neste método, você pode especificar as alterações a serem feitas em um modelo mais antigo para atualizá-lo e corresponder à versão atual do esquema.
Ao salvar um modelo que não tem uma versão de esquema especificada, a traça HasSchemaVersion
pressupõe que ele segue a versão de esquema mais recente. Ao recuperar um modelo que não contém o campo schema_version
, o traço pressupõe que sua versão de esquema é 0
e executa a migração.
Exemplo de versionamento de esquema
Nesta situação de exemplo, você está trabalhando com uma coleção que foi modelada pela seguinte classe:
namespace App\Models; use MongoDB\Laravel\Eloquent\Model; class Planet extends Model { protected $fillable = ['name', 'type']; }
Agora, você deseja implementar uma nova versão do esquema na coleção. Você pode definir a nova classe de modelo com o seguinte comportamento:
Implementa a traça
HasSchemaVersion
e define oSCHEMA_VERSION
atual como2
Define o método
migrateSchema()
para migrar modelos em que a versão do esquema é menor que2
para ter um campogalaxy
que tenha um valor de'Milky Way'
namespace App\Models; use MongoDB\Laravel\Eloquent\HasSchemaVersion; use MongoDB\Laravel\Eloquent\Model; class Planet extends Model { use HasSchemaVersion; public const SCHEMA_VERSION = 2; protected $fillable = ['name', 'type', 'galaxy']; /** * Migrate documents with a lower schema version to the most current * schema when inserting new data or retrieving from the database. */ public function migrateSchema(int $fromVersion): void { if ($fromVersion < 2) { $this->galaxy = 'Milky Way'; } } }
No documento "WASP-39 b"
no código a seguir, o valor do campo schema_version
é menor que 2
. Quando você recupera o documento, o Laravel MongoDB adiciona o campo galaxy
e atualiza a versão do esquema para a versão atual, 2
.
O documento "Saturn"
não contém o campo schema_version
, portanto, o Laravel MongoDB atribui a ele a versão atual do esquema ao salvar.
Por fim, o código recupera os modelos da coleção para demonstrar as alterações:
// Simulates a document in the collection with schema version 1 Planet::insert([ [ 'name' => 'WASP-39 b', 'type' => 'gas', 'schema_version' => 1, ], ]); // Saves a document with no specified schema version $saturn = Planet::create([ 'name' => 'Saturn', 'type' => 'gas', ]); // Retrieves both models from the collection $planets = Planet::where('type', 'gas') ->get();