目前,我正试图建立一个基于课程和课程部分列表的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,中,我有下面的代码,在它根据原始查询将数组提供给视图时构造该数组
$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中,并将模型作为数据库中结构的直接表示?
发布于 2016-02-18 16:44:41
您可以使用访问器和变异器将额外的数据附加到雄辩的模型中。
<?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注意:我还没有测试过这段代码,但是我从我用Laravel5.1构建的一个项目中获得了它,它使用了这些方法。我还没有编写生成$values数组的代码,但是您应该能够根据现有代码将这些代码组合在一起。
或者,如果您想修改数据库结构,可以考虑使用阵列铸造,它将自动序列化/反序列化一个数组,以便将其存储为数据库中的文本。
发布于 2016-02-18 16:44:35
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,当您将days属性序列化到JSON时,days属性将由appends属性提供。
https://stackoverflow.com/questions/35486906
复制相似问题