簡體   English   中英

Laravel 的 Eloquent whereIn 方法中的原始語句

[英]Raw statement in Laravel's Eloquent whereIn method

我只想運行這樣的查詢:

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);

這個根本行不通。 任何的想法?

這是一種更安全的方法:

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

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

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

這個對我有用。 這是非常丑陋的。

// 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();

我使用 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());

您仍然可以像這樣使用 eloquent whereNotIn:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM