提问人:javier Rizos marcos segura 提问时间:8/10/2023 最后编辑:javier Rizos marcos segura 更新时间:8/10/2023 访问量:133
错误“哎呀,看起来出了点问题。
Error "Whoops, looks like something went wrong." in Laravel page
问:
首先,非常感谢您阅读我并帮助我,因为我是 laravel 的新手。
我已经部署了一家公司给我的网站,除了在数据库的post_categories表中搜索外,其他一切都可以正常工作。
当我输入一个链接来执行对数据库的查询以获取该类别的所有帖子时,我收到以下错误(在本例中为类别 13):
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '>'$. "en"' asc' at line 1 (SQL: select * from `post_categories` where `post_categories`.`parent_id` = 13 and `post_categories`.`parent_id` is not null order by `title`->'$. "en"' asc)
但是,如果我直接转到该类别中的任何帖子,它都是完全可见的,因此它只会影响搜索引擎。
该错误是由于 ->'$.“es”部分似乎不起作用,但我不知道为什么,因为据我所知,查询是直接从这里生成的。title
public function select($query, $bindings = [], $useReadPdo = true)
{
return $this->run($query, $bindings, function ($query, $bindings) use ($useReadPdo) {
if ($this->pretending()) {
return [];
}
// For select statements, we'll simply execute the query and return an array
// of the database result set. Each element in the array will be a single
// row from the database table, and will either be an array or objects.
$statement = $this->prepared($this->getPdoForSelect($useReadPdo)
->prepare($query));
$this->bindValues($statement, $this->prepareBindings($bindings));
$statement->execute();
return $statement->fetchAll();
});
}
我以为也许是一些没有很好地定义的 php 变量失败了,但我没有接触任何代码,因为我只部署了公司服务器上的 Web 才能正确进行搜索。
有谁知道如何指导我解决这个错误?
谢谢大家!
以上已提供所有数据和证据
编辑: 多亏了ceejayoz,我发现问题是MariaDB不支持调用:
select * from `post_categories` order by `title`->'$. "en"' asc
它必须如下:
select * from `post_categories` order by JSON_EXTRACT(`title`, '$. "en"') asc;
有谁知道如何让 Laravel 替换所有对新格式的调用?
谢谢!
答:
您似乎已经确定了问题和解决方案,这涉及在 SQL 查询中使用 JSON_EXTRACT,而不是在 order by 子句中对 JSON 字段使用 -> 表示法。要将此更改应用于 Laravel 自动生成的所有查询,您可以利用查询构建器的宏功能。
在 Laravel 应用程序中,您可以在服务提供程序(如 AppServiceProvider)中创建宏。下面介绍如何定义宏以将 -> 表示法替换为 JSON_EXTRACT
use Illuminate\Database\Query\Builder;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Builder::macro('orderByJsonField', function ($field, $jsonKey, $direction = 'asc') {
return $this->orderByRaw("JSON_EXTRACT($field, '$. \"$jsonKey\"') $direction");
});
}
}
在上面的代码中,我们定义了一个名为 orderByJsonField 的宏。然后,可以在任何查询生成器实例上使用此宏,以按 JSON 字段的子项进行排序:
// Usage example
$categories = DB::table('post_categories')
->where('parent_id', 13)
->orderByJsonField('title', 'en', 'asc')
->get();
通过使用此宏,可以在整个应用程序中自动应用正确的格式,以便按具有特定子项的 JSON 字段进行排序,而无需手动修改每个查询。
请记住将此宏添加到服务提供商的引导方法中,并确保服务提供商已在您的 config/app.php 文件中注册。这将确保宏在整个应用程序中都可用。
评论
order by title->'$. "en"'
看起来这是一个与翻译相关的查询。它看起来不太像 dev.mysql.com/doc/refman/8.0/en/ 中的例子......您是否正在为某种可翻译模型使用包?