我可以在Laravel模型

时间:2016-02-18 16:23:05

标签: php mysql laravel

我目前正在尝试根据课程和课程部分列表构建一个Laravel模型。对于“课程部分”数据库表中的每个记录,每周的每一天都有7列。

CourseID|SectionNumber|...|Mon|Tue|Wed|Thu|Fri|Sat|Sun|
-------------------------------------------------------
  1001  |      01     |...|Mon| 0 |Wed| 0 | 0 | 0 | 0 |

不可否认,它不是设计最好的数据库(它可能应该是布尔值,也可能作为关系表而不是在同一个大表中有意义)但我不能直接控制在那一部分。

但我想要做的是将所有这些日子存储在课程模型中的一个值$days下的数组中,但是我不太确定该去哪里。我的最终目标是能够将CourseSection模型序列化为JSON提要。

$course->days;
//should return [Mon, Wed]

现在,在我的 CourseController 中,我有以下代码构建该数组,因为它根据原始查询将其提供给View

$days = array_where([$result->isMon, $result->isTue, $result->isWed, $result->isThu, $result->isFri, $result->isSat, $result->isSun], 
                       function ($key, $value)
    {
        return $value != "0";
    });

$courses[$course_key]['sections'][$result->section_number]->days = $days;

我想我的问题是我可以在一个模型中完成所有这些吗?是否可以使变量等于数组?或者它应该保留在Controller中并将模型作为数据库中结构的直接表示?

2 个答案:

答案 0 :(得分:1)

class Course extends Model {

    public $appends = ['days'];

    public function getDaysAttribute(){

        $days = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun'];
        $course = this;
        return array_where($days,function($key, $val) use ($course)){
            return $course[$value] != 0;
        }

    }

}

然后您可以使用$course->days,当您序列化为JSON时,days属性将包含在appends属性中。

答案 1 :(得分:1)

您可以使用Accessors and Mutators将额外数据附加到您的Eloquent模型中。

<?php
namespace App;

use Illuminate\Database\Eloquent\Model as Eloquent;

class Course extends Eloquent
{
    protected $appends = ['days'];

    public function getDaysAttribute()
    {
        $values = [];
        // Build your array of data from your existing database structure here...
        return $values;
    }
}

然后,您可以在控制器中无需额外工作的情况下参考此新项目:

$course = Course::find(1);
$array = $course->days; // This value will come from the getDaysAttribute() value in the Eloquent model

注意:我还没有测试过这段代码,但是我从Laravel 5.1中使用这些方法构建的一个项目中获取了它。我没有编写用于生成$values数组的代码,但您应该能够根据现有代码将它们放在一起。

或者,如果您想修改数据库结构,可以使用Array Casting来自动序列化/反序列化数组,以便在数据库中作为文本存储。