我不知道如何以非常明确的方式格式化这篇文章的标题,但这是我的问题:
说我有
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()....类似命令。
我希望我的问题很明确。
感谢。
答案 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