错误“哎呀,看起来出了点问题。

Error "Whoops, looks like something went wrong." in Laravel page

提问人:javier Rizos marcos segura 提问时间:8/10/2023 最后编辑:javier Rizos marcos segura 更新时间:8/10/2023 访问量:133

问:

首先,非常感谢您阅读我并帮助我,因为我是 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 替换所有对新格式的调用?

谢谢!

php sql mysql laravel laravel-5

评论

0赞 ceejayoz 8/10/2023
order by title->'$. "en"'看起来这是一个与翻译相关的查询。它看起来不太像 dev.mysql.com/doc/refman/8.0/en/ 中的例子......您是否正在为某种可翻译模型使用包?
0赞 javier Rizos marcos segura 8/10/2023
好的,从您的链接中,我看到这是一种获取 Json 部分的方法,实际上在该部分中我们有一个 json。但是似乎我的MariaDB不喜欢它,我该怎么办?
0赞 ceejayoz 8/10/2023
您的翻译功能使用什么?一个包裹?手工制作的东西?
0赞 javier Rizos marcos segura 8/10/2023
嗨@ceejayoz据我所知,我没有使用任何翻译系统。问题来自另一面,多亏了你的评论,我设法找出了答案。我已经编辑了主要帖子。

答:

0赞 Waxim Arshad 8/10/2023 #1

您似乎已经确定了问题和解决方案,这涉及在 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 文件中注册。这将确保宏在整个应用程序中都可用。