Menu Docs
Página inicial do Docs
/ / /
Laravel MongoDB
/

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

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.

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:

<?php
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 .

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:

<?php
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.

Esta seção mostra como executar as seguintes personalizações de comportamento do modelo Eloquent:

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 :

<?php
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 .

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 :

<?php
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.

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 :

<?php
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.

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 .

<?php
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.

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 :

<?php
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.

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 MongoDB ObjectId para o tipo string

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:

<?php
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.

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érios

  • MongoDB\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.

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:

<?php
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
}
}

A seguinte classe prunable em massa inclui um método prunable() que corresponde a modelos que a ação de podar exclui:

<?php
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);
}
}

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.

Nesta situação de exemplo, você está trabalhando com uma coleção que foi modelada pela seguinte classe:

<?php
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 o SCHEMA_VERSION atual como 2

  • Define o método migrateSchema() para migrar modelos em que a versão do esquema é menor que 2 para ter um campo galaxy que tenha um valor de 'Milky Way'

<?php
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();

Voltar

Modelos eloquentes

Próximo

Relacionamentos