在Laravel的Eloquent whereIn方法中的原始声明

时间:2014-06-29 14:07:27

标签: php laravel pdo laravel-4 eloquent

我只想运行这样的查询:

select * from `users` where SUBSTRING_INDEX(`email`, '@' ,-1) not in ('gmail.com, outlook.com');

我想到了两种不同的方法:

1

$providers = array('gmail.com', 'outlook.com');

$providers = "'" . implode("', '", $providers) . "'";

User::whereRaw("SUBSTRING_INDEX(`email`, '@' ,-1) not in (?)", $providers);

以上操作无效,因为PDO会转义“'”字符。

2

User::whereIn(DB::raw("SUBSTRING_INDEX(`email`, '@' ,-1)", $providers);

这个根本不起作用。任何想法?

4 个答案:

答案 0 :(得分:3)

这是一种更安全的方法:

$providers = ['gmail.com', 'outlook.com'];

$placeholder = implode(', ', array_fill(0, count($providers), '?'));

User::whereRaw("SUBSTRING_INDEX(`email`, '@' ,-1) not in ($placeholder)", $providers);

答案 1 :(得分:2)

这个适合我。这非常难看。

// sanitize the array or use an hardcoded one!
$providers = array('gmail.com', 'outlook.com');
$users = User::whereRaw("SUBSTRING_INDEX(`email`, '@' ,-1) NOT IN ('".implode("','", $providers)."')")->get();

答案 2 :(得分:0)

我whereRaw用于设置复杂查询而无需对数据库进行多次调用,通过重用另一个查询来提供我需要的结果。 请注意使用$query->getQuery()->getBindings()绑定第一个查询的变量。

    $modelblock = new ModelBlock();
    $blocklink = new BlockLink();
    $traveltour = new TravelTour();

    $page = $this;

    $query = $page->richblock()->getQuery()
    ->join($modelblock->getTable(),
        $blocklink->getTable().'.block_id',
           '=',
        $modelblock->getTable().'.'.$modelblock->getKeyName())
      ->where($modelblock->getTable().'.modelclass','=',get_class($traveltour))
      ->select($blocklink->getTable().'.block_key');

    $ret = $traveltour->newQuery()->select('*')
                      ->whereRaw($traveltour->getKeyName().' in ( '.
                           $query->toSql() . ')'
                           ,$query->getQuery()->getBindings());

答案 3 :(得分:0)

您仍然可以这样使用雄辩的whereNotIn:

User::whereNotIn(DB::raw("SUBSTRING_INDEX(`email`, '@' , -1)"), ['gmail.com', 'outlook.com'])->get();