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

时间:2012-12-20 20:54:12

标签: fluent laravel eloquent

我确信这很简单,但我找不到任何例子。

我使用流畅的Laravel应用程序来记录用户的登录信息,因此我创建了自己的auth驱动程序,但是我遇到了一个混合原始数据和没有原始数据的流畅查询的问题,请看下面的内容:

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所说,如果它看起来很难看,那就不在框架中......所以我想知道我在这里缺少什么。

2 个答案:

答案 0 :(得分:3)

使用雄辩的

首先,如果尚未完成,请为登录创建一个模型,这样您就可以使用laravel自己的ORM 雄辩。 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 :(得分:0)

好的,没关系,好​​像是“?”问号只是意味着流利没有达到创建准备好的陈述的那一部分。我是Laravel和Fluent的新手,我认为问号意味着错误出现在查询的那一部分。