Laravel对某种Model Ready方法的看法

时间:2017-06-04 00:54:30

标签: php laravel laravel-5

我不知道如何以非常明确的方式格式化这篇文章的标题,但这是我的问题:

说我有

Posts::find('1);
Photos:find('1');
... and so on, every mode db request

现在默认情况下我可以访问db列,例如id:through model-> id

$Photos = Photos::find('1')->first();
echo $Photos->id; // will return 1

我想要的是我需要所有这些请求自动添加自定义字段,如hashed_id,这不在数据库中,作为回报,这将使所有模型都具有hashed_id,我知道我可以添加字段到数据库,然后抓住它,但我需要它由于不同的原因/实现

我确实创建了一个BaseModel,每个Model都会扩展BaseModel,因此Photos扩展了BaseModel,BaseModel扩展了Model ......以及所有等等。

但我需要某种构造函数,在检索数据时自动处理数据,而不必在检索数据后添加-let的 - 一个hash_id()。

类似于onAfterGet(),onReady()....类似命令。

我希望我的问题很明确。

感谢。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您需要做的就是定义mutator,例如:

<?php
class Photo extends Model
{
    /* ... model implementation ... */

    public function getHashedIdAttribute()
    {
        return md5($this->id);
    }
}

然后您可以像访问数据库一样访问属性:

echo Photo::find(5)->hashed_id;

答案 1 :(得分:1)

您正在寻找的是Accessor。 Accesors可用于向模型添加自定义属性。将其与$appends属性相结合,您就可以得到所需的内容。 $appends属性在每个结果中添加自定义访问者。

您可以通过创建问题中所述的基本模型或使用特征来实现此目的。我将向您展示如何使用基本模型实现此目的。

让我们创建一个名为BaseModel的基础模型。所有其他需要此自定义属性的模型都会对此进行扩展。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class BaseModel extends Model
{
    protected $appends = ['hashed_id'];

    public function getHashedIdAttribute()
    {
        return some_hash_function($this->id);
    }
}

我们有一个Image模型,可以扩展我们的BaseModel

<?php

namespace App;

class Image extends BaseModel
{

}

现在,Image模型的每个结果都会默认添加hashed_id字段。

Accesor记录https://laravel.com/docs/5.4/eloquent-mutators#defining-an-accessor