Laravel Eloquent Tips

10 Recursos do Eloquent que talvez você não saiba.

Danilo Lutz
JunDevelopers

--

A documentação do Laravel costuma auxiliar muito no aprendizado do framework, que convenhamos é um framework que ficou gigante. Dado a essa característica o Lavarel, mais precisamente o Eloquent ORM, tem alguns recursos os quais a documentação não cobre. Iremos falar deles neste artigo.

1. E os atributos originais?

Se eu disser que após uma alteração nos dados de um Model é possível recuperar os atributos originais do mesmo? Como? Com o getOriginal().

$user = App\User::first();
$user->name; //Danilo.
$user->name = "Robson";
$user->getOriginal("name"); // Danilo.
$user->geOriginal(); // Recupera o objeto $user inicial.

2. Verificando se algo mudou…

E se em algum momento precisarmos verificar se algo mudou, seja o objeto ou seja uma propriedade? Vejamos o uso do isDirty().

$user = App\User::first();
$user->isDirty(); //false
$user->name = "Danilo";
$user->isDirty(); //true

Verificando algum atributo em particular

$user = App\User::first();
$user->isDirty(); //false
$user->name = "Danilo";
$user->isDirty('name'); //true
$user->isDirty('age'); //false

3. Quero a lista do que mudou…

Isso podemos obter tranquilamente através do método: getChanges().

$user->getChanges();//[
"name" => "Danilo",
]

Observação: As Alterações serão refletidas apenas se você salvar o Model ou sincronizá-las através do método syncChanges().

4. E se eu quiser mudar o nome da coluna do soft delete.

Bom, você pode! Sabemos que por padrão o Laravel resolve os soft deletes usando o nome de coluna deleted_at. Para alterar esse nome basta alterar, ou melhor, sobrescrever a propriedade DELETED_AT. Não queria falar nada não, mas você pode mudar também as colunas created_at e updated_at, como… ué da mesma forma. ;-)

class User extends Model
{
use SoftDeletes;
* The name of the "deleted at" column.
*
* @var string
*/
const DELETED_AT = 'is_deleted';
}

5. Models e suas relações…

Saiba que você pode salvar um Model e suas respectivas relações usando um método chamado push()?

class User extends Model
{
public function phone()
{
return $this->hasOne('App\Phone');
}
}
$user = User::first();
$user->name = "Danilo";
$user->phone->number = '1234567890';$user->push(); // Esse comando irá atualizar ambos no BD.

6. Recarregando do banco de dados…

Por meio de um método chamado fresh() podemos recuperar do banco de dados uma nova instancia zeradinha do Model.

$user = App\User::first();
$user->name; // Danilo
// Em algum momento a propriedade "name" é definida e atualizada no // BD como, por exemplo: Robson.$updatedUser = $user->fresh();
$updatedUser->name; // Robson
$user->name; // Danilo

7. A volta dos que não foram…

Nós conseguimos zerar, ou seja recuperar do banco de dados, os dados de uma instância de um Model usando o método refresh().

$user = App\User::first();
$user->name; // Danilo
// Em algum momento a propriedade "name" é definida e atualizada no // BD como, por exemplo: Robson.$user->refresh(); $user->name; // Robson

Observação: vale lembrar que o método refresh() também irá recarregar as relações do model.

8. Ainda somos os mesmos?

Verificando se dois Models possuem o mesmo Id e pertencem a mesma tabela.

$user = App\User::find(1);
$sameUser = App\User::find(1);
$diffUser = App\User::find(2);
$user->is($sameUser); // true
$user->is($diffUser); // false

9. Criando um clone

Usando o método replicate() você pode clonar um Model. Então será criada uma cópia do model em uma nova instância.

$user = App\User::find(1);$newUser = $user->replicate();
$newUser->save();

10. Procurando pelo que queremos…

Quando usamos os métodos find() ou findOrFail() você pode especificar as colunas que serão selecionadas.

$user = App\User::find(1, ['name', 'age']);
$user = App\User::findOrFail(1, ['name', 'age']);

Bom por hoje eu vou parando por aqui… até a próxima. 😎

Por favor, não deixem de compartilhar, comentar e deixar seu feedback.

Referências

--

--

Danilo Lutz
JunDevelopers

Obsessed for learning. OOP, PHP, C# and Python lover. Since 2003 coding...