2017-08-02 27 views
1

我有一个非常大的桌子,我想每年有一张桌子。我需要用唯一的模型来表示多个表。根据年份的不同,我已经完成了写作,但我不知道如何使用orm读取多个表格。任何建议?我使用Laravel 5.3如何用唯一模型表示多个表?

class Management extends Model 
{ 
    protected $table = 'management_2017'; 

    public function setTableYear($date = null){ 
     if (is_null($date)) 
      $date = \Carbon::now(); 
     if ($date->year >= 2017) 
      $this->setTable('management_' . $date->year); 
    } 
} 

class MyController extends Controller 
{ 
    public function saveManagement(){ 
     $management = new Management(); 
     $management->setTableYear(); 
     //... set attributes 
     $management->save(); 
    } 

    public function readManagement(Request $request){ 
     $idManagement = $request->get('managementId'); 
     // I dont know how to set a table here. Default table is 'management_2017' 
     $management = Management::find($idManagement); 
    } 
} 
+0

我想你不能只在桌子上放一个YEAR字段? –

+0

这不是一个设计得很好的数据库,@BenjaminBrasseur有一个很好的例子来说明如何让这个解决方案更具前瞻性。 –

+0

@BenjaminBrasseur号码表非常大。此时要做好备份是很困难的。这个想法是,2018年1月1日,表'management_2017'是只读的。 – learango

回答

1

在你的模型,你可以创建一个返回查询生成器与$表属性更新的方法:

class Management extends Model 
{ 
protected $table = 'management_2017'; 

    public function setTableYear($date = null){ 
     if (is_null($date)) 
      $date = \Carbon::now(); 
     if ($date->year >= 2017) 
      $this->setTable('management_' . $date->year); 
    } 

    public static function getInstance() 
    { 
     $a = new static; 
     $a->setTableYear(); 
     return $a; 
    } 
} 

有了这一点,你可以在你的控制器使用方法:

class MyController extends Controller 
{ 
    public function readManagement(Request $request){ 
     $idManagement = $request->get('managementId'); 
     $management = Management::getInstance()->find($idManagement); 
    } 
} 
+0

它的工作原理,谢谢 – learango