Laravel 模型使用 ltrees 的 postgresql `subpath` 函数获取子路径

Laravel Model get subpath using postgresql `subpath` function for ltrees

我在名为 breadcrumbs 的 postgresql 服务器上有以下 table:

id SERIAL path VARCHAR(300)

使用以下示例数据:

id | path
--- | ---
1 | animes.like.hentai
2 | animes.dislike.hentai
3 | animes.like.shonen
4 | animes.like.action

并使用以下 eloquent 模型建模:

<?php declare(strict_types=1);

namespace App\Model;
use Illuminate\Database\Eloquent\Model as BaseModel;

class Breadcrumbs extends BaseModel
{
   protected $table = 'breadcrumbs';

   // 
}

我想在不使用 sql 的情况下执行以下 select:

select * from breadcrumbs where subpath(et_location_desc.path, 0, 1) != 'hentai'

到目前为止,我尝试使用以下代码:

Breadcrumbs::where("subpath(path, 0, 1)","hentai")->all();

但是我得到以下错误:

Illuminate/Database/QueryException with message 'SQLSTATE[42703]: Undefined column: 7 ERROR:  column "subpath(path, 0, 1)" does not exist
LINE 1: select * from "breadcrumbs" where "subpath(path, 0, 1)"...
                                               ^ (SQL: select * from "breadcrumbs" where "subpath(path, 0, 1)" = hentai '

意味着 where() 方法的第一个参数是自动引用的,假设它是一个列而不是一个函数。

那么我如何扩展模型的查询构建器或按原样使用上面的代码来执行正确的 select?

如本 所示,同样的原则也适用于此处,而不是:

Breadcrumbs::where("subpath(path, 0, 1)","hentai")->all();

使用:

Breadcrumbs::where(DB::raw("subpath(path, 0, 1)"),"hentai")->all();

如文档中所示,您可以使用 DB:raw 来绕过将列名作为第一个参数的限制。