如何在 Kohana 3 ORM 选择查询中使用数据库函数

发布于 2024-09-07 21:06:22 字数 710 浏览 5 评论 0原文

我将 Postgres 与 Kohana 3 的 ORM 模块结合使用,并希望使用 postgres 函数运行 SELECT,以在进行比较之前将数据库中已有的值转换为小写。

在 SQL 中,我会写:

select * from accounts where lower(email) = '[email protected]';

在 Kohana 中,我想写这样的内容:

$user = ORM::factory('user')
    ->where('lower(email)', '=', strtolower('[email protected]'))
    ->find();

但这会产生错误,因为 ORM 试图将列名推断为“lower(email)”而不仅仅是“email”。

我是 Kohana 和 ORM 的新手,因此能给我相同结果的替代方案也很有用。

I'm using Postgres with Kohana 3's ORM module and would like to run a SELECT using a postgres function to convert values already in the database to lower case before doing the comparison.

In SQL I would write:

select * from accounts where lower(email) = '[email protected]';

In Kohana I would like to write something like this:

$user = ORM::factory('user')
    ->where('lower(email)', '=', strtolower('[email protected]'))
    ->find();

But this gives an error because ORM is trying to deduce the column name as 'lower(email)' rather than just 'email'.

I'm new to Kohana and ORM so alternatives that would give me the same result would be useful too.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

一城柳絮吹成雪 2024-09-14 21:06:23

或者恕我直言,更好的是,试试这个:

$user = ORM::factory('user')
    ->where('LOWER("email")', '=', DB::expr("LOWER('[email protected]')"))
    ->find();

PS。我认为没有必要创建 DB::lower() 帮助程序,但这可能只是我......

编辑:

$value = '[email protected]';

$user = ORM::factory('user')
    ->where('LOWER("email")', '= LOWER', (array) $value)
    ->find();

查询将变成类似(有一段时间没有使用过 ORM)“SELECT users.id, users.id”。来自用户的电子邮件 WHERE LOWER("email") = LOWER ('[电子邮件受保护]') 限制 1"。
注意这个空间,我刚刚更新了一些代码来使用它,因为我刚刚发现了这种可能性。

我希望你会像我一样对此感到满意。

Or IMHO even beter, try this:

$user = ORM::factory('user')
    ->where('LOWER("email")', '=', DB::expr("LOWER('[email protected]')"))
    ->find();

PS. I do not see any need to create a DB::lower() helper, but that might just be me...

EDIT:

$value = '[email protected]';

$user = ORM::factory('user')
    ->where('LOWER("email")', '= LOWER', (array) $value)
    ->find();

The query will become something like (havent used ORM in a while) "SELECT users.id, users.email FROM users WHERE LOWER("email") = LOWER ('[email protected]') LIMIT 1".
Notice the space, I just updated some of my code to use this since I just figured out this posibility.

I hope you will be as happy with it as I am.

这个俗人 2024-09-14 21:06:23

试试这个:

$user = ORM::factory('user')
    ->where(DB::expr('lower(email)'), '=', strtolower('[email protected]'))
    ->find();

try this:

$user = ORM::factory('user')
    ->where(DB::expr('lower(email)'), '=', strtolower('[email protected]'))
    ->find();
清风不识月 2024-09-14 21:06:23

我对助手的使用并不完全满意,但我在其他几个类中使用了它,因此最好将逻辑保留在一个位置。这是我目前正在使用的。

class DB extends Kohana_DB
{
    public static function lower($value)
    {
        return DB::expr('lower('.Database::instance()->quote($value).')');
    }
}

class Model_User extends Model_Base
{
    public static function find_by_email($email)
    {
        $user = ORM::factory('user')
            ->where(DB::expr('lower(email)'), '=', DB::lower($email))
            ->find();
        return $user;
    }

I'm not completely happy with the use of a helper but I use it a couple other classes so it's nice to keep the logic in one location. Here is what I'm currently using.

class DB extends Kohana_DB
{
    public static function lower($value)
    {
        return DB::expr('lower('.Database::instance()->quote($value).')');
    }
}

class Model_User extends Model_Base
{
    public static function find_by_email($email)
    {
        $user = ORM::factory('user')
            ->where(DB::expr('lower(email)'), '=', DB::lower($email))
            ->find();
        return $user;
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文