执行生成的 SQL ,在本地 Windows 10 中可以,在 Liunx 容器中,未查询到记录(与 DIRECTORY_SEPARATOR 有关)
1、执行生成的 SQL ,在本地 Windows 10 中可以,在 Liunx 容器中,未查询到记录。在 Windows 10 下打印记录。如图1
$rawSchema = ThemeAssetEntity::select('schema') ->where('theme_id', '=', $this->getThemeId()) ->where('category', '=', ThemeAssetEntity::CATEGORY_PAGE) ->where('asset_key', 'regexp', $this->themeLayout->getTemplateExtensionsPattern($basename)) ->first(); var_dump($rawSchema); exit;
2、在 Liunx 容器 下打印记录。其结果为 NULL。如图2
3、决定打印生成的 SQL,需要删除 ->first() 。进行一下对比。Windows 10 与 Linux 的分别如下,然后在 MySQL 中执行 Linux 下的 SQL ,查询结果为 NULL。区别在于 pages/\ 与 pages//。如图3
$rawSchema = ThemeAssetEntity::select('schema') ->where('theme_id', '=', $this->getThemeId()) ->where('category', '=', ThemeAssetEntity::CATEGORY_PAGE) ->where('asset_key', 'regexp', $this->themeLayout->getTemplateExtensionsPattern($basename)); $query = str_replace(array('?'), array('\'%s\''), $rawSchema->toSql()); $query = vsprintf($query, $rawSchema->getBindings()); dump($query); exit;
select `schema` from `theme_asset` where `theme_id` = '96b1c8b9-5b18-4760-9e26-50ab009ac011' and `category` = 'page' and `asset_key` regexp '^pages/\product_detail(\.blade\.php|\.liquid|\.json)'
select `schema` from `theme_asset` where `theme_id` = '96dcab33-3e1d-4279-ab96-39693f03515f' and `category` = 'page' and `asset_key` regexp '^pages//product_detail(\.blade\.php|\.liquid|\.json)'
4、分析生成正则表达式的函数。打印 DIRECTORY_SEPARATOR,两个环境的结果是不一致的。分别为 \ 与 /
public function getTemplateExtensionsPattern($basename) { $escapeDot = array_map(function($extension){ return str_replace('.', '\\.' ,$extension); }, $this->getTemplateExtensions()); print_r(DIRECTORY_SEPARATOR); exit; return sprintf('^%s%s%s%s', $this->getPageDir(), '/'.DIRECTORY_SEPARATOR, $basename, '('.join('|', $escapeDot) .')'); }
\
/
5、删除掉 .DIRECTORY_SEPARATOR,因为其在两个操作系统中不一致。且因为在表中仅使用 /,无需要再转义。最终生成的 SQL 在两个操作系统中一致。且能够查询到结果。如图4
public function getTemplateExtensionsPattern($basename) { $escapeDot = array_map(function($extension){ return str_replace('.', '\\.' ,$extension); }, $this->getTemplateExtensions()); return sprintf('^%s%s%s%s', $this->getPageDir(), '/', $basename, '('.join('|', $escapeDot) .')'); }
"select `schema` from `theme_asset` where `theme_id` = '96dcab33-3e1d-4279-ab96-39693f03515f' and `category` = 'page' and `asset_key` regexp '^pages/product_detail(\.blade\.php|\.liquid|\.json)'"
近期评论