在Laravel中使用Eloquent对象作为字典表

时间:2015-09-11 12:57:13

标签: laravel laravel-5 eloquent

我有不同的课程,作为"字典"例如,列出了CarType一级哈瓦表,idvalue字段(1,'小&#39 ;; 2,'大' ..)

有没有办法可以将这样的模型用作地图列表(在内存中使用缓存数据),以便在我的刀片文件中有类似的东西:

{{ CartType->value($model->type_id) }}

这个想法将是

  • 将所有数据加载到内存中(或者在2次请求后加载到leas) 不同的价值观)
  • 很容易包裹模特的某些字段

1 个答案:

答案 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;