所以我有一張這樣的桌子

如您所見,現有表的名稱幾乎相似,每個表table都有相同的column結構,每個表只有一個月的資料,例如air_message2021_01只有一月份的資料,air_message2021_02只有二月份的資料等。
在我的專案中,它需要通過JOIN一些現有的表來搜索資料,但像這樣動態地搜索。

在圖片中,您可以看到飛機 ID 欄位、年份、日期包含月份和日期欄位、日期包含月份和日期欄位、時間欄位和時間欄位。
因為每個表只有 1 個月的資料,用戶可以搜索 6 個月時間跨度的資料,所以我必須動態合并表,因為系統不知道用戶要查找的時間范圍。
例子
User1搜索資料飛機ID BTK7369從2021-01-12到2021-04-20
這意味著我必須加入air_message2021_01, air_message2021_02,air_message2021_03和air_message2021_04
User2搜索資料aircarft ID BTK7552從2021-05-27到2021-08-09
這意味著我必須加入air_message2021_05, air_message2021_06,air_message2021_07和air_message2021_08
如何解決?
謝謝
uj5u.com熱心網友回復:
您可以宣告的表模型與air_message*以下內容相同:
class AirMessageRead extends Model
{
/**
* Name base table
*
* @var string
*/
protected $baseTable = 'air_message';
/**
* The table associated with the model.
*
* @var string
*/
protected $table = '';
/**
* For Read.
*
* @var string
*/
public $exists = true;
/**
* AirMessageRead constructor.
*
* @param int $time
* @return void
*/
public function __construct($time)
{
$this->table = $this->getTableName($time);
}
/**
* Get table name
*
* @param int $time
* @return string
*/
public function getTableName($time)
{
return $this->baseTable . $time;
}
}
在service您將范圍日期轉換為陣列 () 和洋蔥時:
use Carbon\CarbonPeriod;
private function getTimeRange($start, $end)
{
foreach (CarbonPeriod::create($start, '1 month', $end) as $month) {
$months[] = $month->format('Y_m');
}
return $months;
}
private function getTablesForQuery($start, $end)
{
$months = $this->getTimeRange($start, $end);
$mergeTables = array_map(fn($month) => new AirMessageRead($month), $months);
foreach ($mergeTables as $table) {
if (isset($query)) {
$query = $query->union($table);
} else {
$query = $table;
}
}
return $query
}
并得到洋蔥表:
// $query is model for you
$model = $this->getTablesForQuery('2021-01-12', '2021-04-20');
您可以添加檢查模型上存在表的功能
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/482546.html
