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
- Especifique o comportamento de remoção
- Exemplo executável
- Exemplo executável em massa
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.
Especificar Comportamento de Poda mostra como remover periodicamente os modelos que você não precisa mais.
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.
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); } }