【问题标题】:Laravel Eloquent supporting MariaDb dynamic columnLaravel Eloquent 支持 MariaDb 动态专栏
【发布时间】:2021-04-07 01:26:03
【问题描述】:

对于 Maria-DBMySQL 中支持的 Dynamic 列,我们有 JSON 列类型。对于我们的一个项目,我们应该为 Maria-DB(不是 Mysql)实现一个数据库。

使用yii2-dynamic-ar 包支持动态列

如何在Laravel 中覆盖Eloquent orm 以添加dynamic-columns。在Yii 包中添加了这个特性到ActiveRecord 这个类可以覆盖ActiveRecord

Yii 框架中的实现类在ActiveRecord ORM 中支持:

  1. DynamicActiveRecord.php
  2. DynamicActiveQuery.php

【问题讨论】:

    标签: mysql sql laravel yii2


    【解决方案1】:

    您可以在 Model 类中为列定义强制转换

    //Model class
    
    protected $casts = ['my_column' => 'array];
    

    如果需要,您可以将列的数据类型定义为文本或 json,定义强制转换后,您将能够将列数据用作关联数组。

    还有一个包可以在 mariadb 的迁移中添加 json 数据类型 - 它可能会有所帮助 https://github.com/ybr-nx/laravel-mariadb

    【讨论】:

      【解决方案2】:

      我刚刚使用 eloquent 和查询构建器创建了用于处理 MariaDB 动态列的包。

      要安装软件包,请运行以下命令:

      composer require halalsoft/laravel-dynamic-column
      

      您可以通过添加 HasDynamicColumn 特征来开始使用该包,并将 Dynamic 用作模型的属性转换。

      一个例子:

      use Illuminate\Database\Eloquent\Model;
      use Halalsoft\LaravelDynamicColumn\Dynamic;
      use Halalsoft\LaravelDynamicColumn\HasDynamicColumn;
      
      class MyModel extends Model
      {
          use HasDynamicColumn;
          protected $casts
              = [
                  'the_column' => Dynamic::class,
              ];
      }
      

      现在您可以使用 eloquent 或查询生成器来使用动态列,例如 json 列:

      $modelData = MyModel::find(1);
      
      $columnData = $modelData->the_column;
      
      $columnData['data1'] = 'value';
      $columnData['data2'] = 'value2';
      
      
      $modelData->the_column = $columnData;
      
      $modelData->save();
      

      您也可以将数据字段创建为数组

      $newData = MyModel::create([
          'other_column' => 'this just another column data',
          'the_column' => ['data1'=>'value1','data2'=>'value2']
      ]);
      

      要更新您使用的 json 字段/键,您可以在调用更新方法时使用 -> 运算符:

      $page->update(['content->data1' => 'value1new']);
      

      或者您仍然可以使用普通数组更新整列:

      $page->update(['content' => ['data1'=>'value1new','data2'=>'value2new']]);
      

      您可以使用updateOrCreate()firstOrCreate()等其他方法设置为数组。

      此包还支持使用以下查询构建器:

      Model::query()->where('the_column->data1', 'value1')->first();
      

      这个包还是新的,如果有任何问题或要求请到github issue

      【讨论】:

      • 非常感谢,但我认为您没有仔细阅读我的问题帖子,因为正如我所说,在maria-db 中使用json 没有任何问题,我们想使用@ 987654337@ 而不是 json
      • 对不起,我不知道动态列,我先弄清楚。谢谢
      • @DolDurma laravel 可以像 MySQL 中的 json-column 一样在 MariaDB 上处理 dynamic-column,在我阅读并尝试了 mariadb.com/kb/en/dynamic-columns 之后,上面的代码在我的情况下工作正常
      • 是的,没错,但它不支持 Laravel Eloquent ORM,在 Yii 框架中的开发人员,将其添加到 ActiveResord
      • 我写的代码支持它,“不支持”是什么意思?有 eloquent 支持吗?
      猜你喜欢
      • 2018-07-23
      • 2017-07-14
      • 2014-11-29
      • 2017-08-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      相关资源
      最近更新 更多