How to mix raw SQL and non-raw with Laravel's fluent query builder

eloquent, fluent, laravel

Solution

Use eloquent

First of all, if not already done, create a model for Login, so you can use laravel's own ORM eloquent. Eloquent allows you to write simple and yet powerful queries in a very expressive way.

Now you can do one of these two options:

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

or, maybe more elegant in your case:

$login = new Login;

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

$login->save();

See the eloquent docs for more information.

Problem

I'm sure it's very simple but I couldn't find any examples. I am using fluent in my Laravel application to log my users' logins and so I have created my own auth driver, however I am having a problem with a fluent query that mixes raw data and none raw, look at the following: ``` 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 )); ``` which causes: ``` 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, ) ``` so I did the following: ``` 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) )); ``` But as Dayle Rees says, if it looks ugly it's not in the framework... so I want to know what I am missing here.

Original source