我目前正在尝试根据课程和课程部分列表构建一个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中并将模型作为数据库中结构的直接表示?
答案 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来自动序列化/反序列化数组,以便在数据库中作为文本存储。