如何使用 Laravel 的流畅查询构建器混合原始 SQL 和非原始 SQL

Posted

技术标签:

【中文标题】如何使用 Laravel 的流畅查询构建器混合原始 SQL 和非原始 SQL【英文标题】:How to mix raw SQL and non-raw with Laravel's fluent query builder 【发布时间】:2012-12-08 10:53:24 【问题描述】:

我确定这很简单,但我找不到任何示例。

我在我的 Laravel 应用程序中使用 fluent 来记录用户的登录信息,因此我创建了自己的身份验证驱动程序,但是我遇到了混合原始数据和非原始数据的 fluent 查询的问题,请查看以下内容:

DB::table('logins')->insert(array(
    'login_email' => $arguments['email'],
    'login_date' => DB::raw('UNIX_TIMESTAMP(NOW())'),
    'login_ip'=> DB::raw('INET_ATON('.$_SERVER['REMOTE_ADDR'].')'),
    'login_result' => (bool)$success
));

导致:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your mysql server version for the right syntax to use near '@gmail.com, UNIX_TIMESTAMP(NOW()), INET_ATON(127.0.0.1), ?)' at line 1

SQL: INSERT INTO `cs_logins` (`login_email`, `login_date`, `login_ip`, `login_result`) VALUES (?, UNIX_TIMESTAMP(NOW()), INET_ATON(127.0.0.1), ?)

Bindings: array (
  0 => false,
)

所以我做了以下事情:

DB::table('logins')->insert(array(
    'login_email' => DB::raw("'".$arguments['email']."'"),
    'login_date' => DB::raw('UNIX_TIMESTAMP(NOW())'),
    'login_ip'=> DB::raw('INET_ATON('.$_SERVER['REMOTE_ADDR'].')'),
'login_result' => DB::raw((bool)$success)
));

但正如 Dayle Rees 所说,如果它看起来很难看,它不在框架中......所以我想知道我在这里缺少什么。

【问题讨论】:

【参考方案1】:

使用雄辩

首先,如果还没有完成,请为 Login 创建一个模型,这样你就可以使用 laravel 自己的 ORM eloquent。 Eloquent 允许您以非常富有表现力的方式编写简单而强大的查询。

现在您可以执行以下两个选项之一:

$logins = Login::create(array('email' => 'example@gmail.com'));

或者,在你的情况下可能更优雅:

$login = new Login;

$login->email = 'example@gmail.com';
$login->login_date = DB::raw('UNIX_TIMESTAMP(NOW())');

$login->save();

请参阅 eloquent docs 了解更多信息。

【讨论】:

+1 tnx 获取信息,我购买并阅读了 Dayle Rees 的教程,我认为 Fluent 似乎更容易开始,我认为主要是因为他使用了更多 Fluent 示例,并展示了它们如何与数据透视表一起使用这么容易。你认为雄辩是要走的路吗? eloquent 是否具有相同的简单语法来轻松检索、更新、删除具有多个连接的多个表? 顺便说一句,我在库文件夹中创建了一个身份验证驱动程序,如何从库中访问我的登录模型,我的登录模型是 Login 并扩展了 Eloquent。 Eloquent 绝对是要走的路。它对所有操作都有相同的、简单的合成器。大多数操作都等于流利。 User::where_name('simon')->order_by('last_name')->get() 是如何使用 eloquent 检索数据的。唯一真正的区别是User::,否则看起来很相似,对吧? :) 查看文档以获取更多信息,这很容易学习。 Laravel 有一个用于库文件夹中文件的自动加载器。将文件命名为 Classname.php 并相应地创建身份验证类。【参考方案2】:

好吧,没关系,它看起来像“?”问号只是意味着流利没有达到创建准备好的语句的那部分。我是 Laravel 和 Fluent 的新手,我认为问号表示错误出现在查询的那部分。

【讨论】:

没错,问号表示参数丢失/错误。它解决了问题吗?

以上是关于如何使用 Laravel 的流畅查询构建器混合原始 SQL 和非原始 SQL的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 查询构建器 - 如何按别名分组,或进行原始 groupBy

在执行查询之前,如何从 Laravel 的查询构建器中获取原始查询字符串?

将原始 SQL 查询传递给 Laravel 上的查询构建器

从原始 SQL 到 Laravel Eloquent 或查询构建器

将原始 SQL 转换为 Laravel 查询构建器

如何在执行查询之前从Laravel的查询生成器获取原始查询字符串?