2016-02-18 82 views
2

我目前正在尝试基于课程和课程部分列表构建Laravel模型。对于“课程部分”数据库表中的每条记录,可能有一周中的每一天有7列。我可以有一个字段,将多个MySQL列合并到Laravel模型中的一个数组中

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中,并将Model作为数据库中结构的直接表示形式?

+0

我会在模型上创建一个属性,然后将它附加到附件 - 这样,您始终可以在课程中使用它。有关文档,请参阅此处:https://laravel.com/docs/5.2/eloquent-serialization#appending-values-to-json –

回答

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这将自动连载/ deserialise阵列存储在数据库中的文本。

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属性的礼貌。

相关问题