如何使用 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 的查询构建器中获取原始查询字符串?