Модель Laravel получает подпуть, используя функцию `subpath` postgresql для ltrees - PullRequest
0 голосов
/ 29 октября 2019

У меня есть следующая таблица на сервере postgresql с именем breadcrumbs:

id SERIAL path VARCHAR(300)

со следующими примерами данных:

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

И моделируетсяиспользуя следующую красноречивую модель:

<?php declare(strict_types=1);

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

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

   // 
}

И я хочу выполнить следующий выбор без использования sql:

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() заключен в кавычки, предполагая, что он является столбцом, а не функцией.

Итак, как я могу либо расширить построитель запросов модели, либо использовать приведенный выше код для правильного выбора?

1 Ответ

0 голосов
/ 29 октября 2019

Как видно из этого ответа , здесь применяется тот же принцип, а не:

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

Использование:

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

Как видно из документации, вы можетеиспользуйте DB:raw, чтобы обойти ограничение на использование имени столбца в качестве первого аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...