【问题标题】:Separate table for each year in LaravelLaravel 中每年的单独表格
【发布时间】:2020-04-16 07:44:37
【问题描述】:

Laravel如何实现基于年份的表格,如Orders2020Orders2019Orders2018等,如何切换?

【问题讨论】:

  • 如果你有一个带有 year 列和适当索引的表,你可以在 Laravel 中使用 scopes 。对于多个表,我没有看到任何引人注目的用例。或者,您可以有一个年度计划任务,将orders 复制到一个新的ordersXXXX 表中并清除该表。这样,写入的唯一表保持不变
  • 是的,我正在考虑手动删除旧记录,想知道是否有办法在 laravel 中自动完成,感谢建议范围
  • 想知道为什么要拥有这么多桌子。您可以有一个表并在其中包含多个数据。只需从中选择您想要的数据。

标签: php mysql database laravel database-migration


【解决方案1】:

我认为你可以做到scope

示例:

public function scopeYear($query,$year)
{
    $this->table = 'orders'.year;
    return $query;
}
  • 要从 2019 年订单表中获取,只需使用 Order::year('2019')->get();
  • 要为orders2019 表创建数据,只需使用Order::year('2019')->create($data);

【讨论】:

  • 'orders'.year 必须替换为 'orders'.$year public function scopeYear($query,$year) { $this->table = 'orders'.$year; return $query; }
【解决方案2】:

我有一个数据量很大的模型,每个月会产生近千万+条记录,所以我也拆分了它的表范围。

解决方法如下,

在您的订单模型中:

use Illuminate\Support\Carbon;

class Order extends Model
{
    protected $table = '';
    public function __construct($year='')
    {
        parent::__construct();

        if (empty($year)) {
            $tablename = 'orders'.Carbon::now()->year;
        } else {
            $tablename = 'orders'.$year;
        }
        $this->setTable($tablename);
    }
}

这样你就可以得到你想要的表了:

$orders2018 = new Order('2018');
$orders2018->where(...)->get();

$orders = Order::where(...)->get(); // will search from the table this year.

【讨论】:

  • 好方法,如何为每年自动生成表格?
  • @Mohsen 您可以使用 schedule 在明年之前生成表格。例如,您可以在 2020 年生成 table-2021 的命令。
  • 如何对多个表进行计数/求和?让我们说 2018 年到 2020 年
【解决方案3】:
Order::from('orders_2019')->get();

【讨论】:

    【解决方案4】:

    我有 3 个具有相同架构的表 我用这个结构来处理它

    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Support\Facades\Schema;
    
    class ReportValues extends Model
    {
        use HasFactory;      
    
        protected $fillable = [
            'id',
            'user_id',
            'report_id',
            'item_id',
            'value',
        ];
    
        public function scopeGenerate($query, $type, $date){
            $table_name = $type."_".$date;
            if (!Schema::hasTable($table_name)){
                Schema::create($table_name, function (Blueprint $table) {
                    $table->id();
                    $table->integer('user_id');
                    $table->integer('report_id');
                    $table->integer('item_id');
                    $table->tinyText('value');     
                    
                    $table->unique(['report_id', 'item_id', 'user_id']);
                    $table->foreign('user_id')->references('id')->on('users');
                    $table->foreign('item_id')->references('id')->on('report_items');                
                });
            }        
            return $query;
        }
        
        public function scopeSalaries($query, $date){
            $this->table = 'salaries_'.$date;
            return $this;
        }
    
        public function scopeContracts($query, $date){
            $this->table = 'contracts_'.$date;
            return $this;
        }
    }
    
    

    然后使用这个命令来使用它们:

    为每个月的客户工资生成表格:

    ReportValues::generate('salaries', '202101')

    然后

    ReportValues::salaries('202101')->get()

    或生成每年的合同表
    ReportValues::generate('contracts', '202101')
    然后
    ReportValues::contracts('2021')->get()

    我的桌子是:

    salaries_202101
    contracts_2021

    【讨论】:

      猜你喜欢
      • 2017-10-06
      • 2016-08-07
      • 2017-10-04
      • 2015-06-28
      • 2018-08-30
      • 2021-07-14
      • 1970-01-01
      • 2020-11-28
      • 2020-08-27
      相关资源
      最近更新 更多