我有不同的课程,作为"字典"例如,列出了CarType
一级哈瓦表,id
,value
字段(1,'小&#39 ;; 2,'大' ..)
有没有办法可以将这样的模型用作地图列表(在内存中使用缓存数据),以便在我的刀片文件中有类似的东西:
{{ CartType->value($model->type_id) }}
。
这个想法将是
答案 0 :(得分:2)
你可以使用Eloquent(使用关系,如@TimLewis建议的那样)执行此操作,但如果它是一个只有几个值的简单地图(即不是数百个不同的选项),那么你将会可能会发现Eloquent为这样一个简单的函数增加了很多开销。
相反,我会在自定义访问器中使用数据库查询。例如,
想象一下,你有一个Car
Eloquent模型,每辆车只有一个“车型”值(在数据库中用car_type
字段表示)。
想象一下,您的数据库中还有一个用于列出汽车类型的表,称为(不出意料)car_types
。
这是一个快速图表:
|------------------|
|cars | |------------------|
|------------------| |car_types |
|id INT PRIMARY_KEY| |------------------|
|car_type_id INT | -- one-to-many --> |id INT PRIMARY_KEY|
|... | |name CHAR |
|------------------| |------------------|
你可以为car_type
设置一个Eloquent模型并定义一个关系。这样可以正常工作,但你真的需要一个Eloquent模型的所有功能吗?
相反,您可以在汽车模型上设置an accessor:
class Car extends Eloquent {
public function getCarTypeAttribute()
{
return DB::table('car_types')
->select('name')
->where('id', '=', $this->car_type_id);
}
}
这将比完整的Eloquent模型加上关系更好。
但你也问过缓存清单。您可以轻松扩展上面的示例,将完整列表存储在缓存中,而不是每次都查询:
class Car extends Eloquent {
public function getCarTypeAttribute()
{
$list = Cache::get('car_types_list');
if (!$list) {
$list = DB::table('car_types')->select('name');
// save in the cache for 60 minutes
Cache::put('car_types_list', $list, 60);
}
// search the list for the type ID
foreach ($list as $type) {
if ($type->id===$this->id) {
return $type;
}
}
// the type wasn't found
throw new Exception("That's not right!");
}
}
现在,如果你有一个Car模型,你可以得到这样的类型:
$car = Car::find(1234);
$type = $car->CarType;