用于 maria-db 动态列的 Laravel 雄辩包装器

Posted

技术标签:

【中文标题】用于 maria-db 动态列的 Laravel 雄辩包装器【英文标题】:Laravel eloquent wrapper for maria-db dynamic columns 【发布时间】:2021-04-28 05:48:33 【问题描述】:

据我所知,哪个MariaDb 有一个Dynamic columns,数据库中此列的数据应该是blob

动态列存储在一个真正的 blob 列中

MariaDb sql 命令中,我们可以使用CREATE_COLUMN 创建一些列,使用GET_COLUMNblob 获取一些列

例如:

插入数据:

INSERT INTO bird_sightings 
(human_id, time_seen, observations) 
VALUES
  (27, NOW(),
   COLUMN_CREATE('wing-shape','pointed', 
  'bill-shape','all-purpose', 'main-color','gray') );

从数据库中获取查询:

SELECT name_first AS 'Birder', 
DATE_FORMAT(time_seen, '%b %d') AS 'Date',
COLUMN_GET(observations, 'wing-shape' AS CHAR) AS 'Wings',
COLUMN_GET(observations, 'wingspan' AS INT) AS 'Span (cm)',
COLUMN_GET(observations, 'bill-shape' AS CHAR) AS 'Beak'
FROM bird_sightings
JOIN humans USING(human_id);

现在我想知道什么?这个结构是否有任何Eloquent 包装器,与它们一起使用ORM?或者我如何在Laravel中使用这个结构@

【问题讨论】:

【参考方案1】:

在没有自己测试的情况下,我认为您可以尝试在模型中添加以下内容:

public function newEloquentBuilder($query) 
      $query->addSelect(DB::raw("COLUMN_GET(observations, 'wing-shape' AS CHAR)"));
      $query->addSelect(DB::raw("COLUMN_GET(observations, 'wingspan' AS CHAR)"));
      $query->addSelect(DB::raw("COLUMN_GET(observations, 'bill-shape' AS CHAR)"));
      return parent::newEloquentBuilder($query);    

如果您只想为特定查询临时获取它们,您可以在查询构建器中添加上述选择,例如

$sighting = BirdSighting::selectRaw("name_first AS 'Birder', 
DATE_FORMAT(time_seen, '%b %d') AS 'Date',
COLUMN_GET(observations, 'wing-shape' AS CHAR) AS 'Wings',
COLUMN_GET(observations, 'wingspan' AS INT) AS 'Span (cm)',
COLUMN_GET(observations, 'bill-shape' AS CHAR) AS 'Beak'")->get()

【讨论】:

在覆盖newEloquentBuilder 方法后你能帮我吗?我该如何使用它?我怎样才能将query 传递给那个? 每当您执行BirdSighting::where(condition) 之类的操作时,都应该调用newEloquentBuilder 方法来创建一个新的查询构建器,在这种情况下,新的构建器将使用这些额外的选择创建,因此不应该有进行查询时,您还需要做些什么才能在模型中获取这些列

以上是关于用于 maria-db 动态列的 Laravel 雄辩包装器的主要内容,如果未能解决你的问题,请参考以下文章

Maria-DB

用于搜索的Laravel动态路由

用于列的 Oracle 动态 SQL

laravel 5.4中的动态播种

没有实际数据库列的表单上的 Laravel Nova 额外“图像”字段

Laravel 验证动态表单输入数据?