簡體   English   中英

Laravel / SQL:返回行,其中列等於NOT'something'並且為NULL

[英]Laravel/SQL: return rows where column Equals NOT 'something" and NULL

LARAVEL 5.4(但可能是更一般的SQL問題)

你好! 我有一個結構表:

在此處輸入圖片說明

假設它是我的模型“表”。

我想要一個查詢:

使用(接收)變量:

數組['id','string',整數]的$ id

其中字符串是“ <”或“>”

$ status_not_bad = bool;

(如果為true-包括'status'!=='bad'AND'status'為NULL的所有行);

例如,我們得到:

$id = ['id', '>', 0];

$status_not_bad = true;

Table::thisquery() ... ->get();

“獲取狀態不差且id> 0的行”返回行1和3。

但是如果我們給出:

$id = ['id', '<', 3];

$status_not_bad = true;

Table::thisquery() ... ->get();

“獲取狀態不差且id <3的行”返回第1行

(應該是使用這些變量返回結果的同一查詢)。

只需鏈接您的->where()子句即可。 也許還考慮將它們包裝起來,以防止與任何其他沖突:

$results = Table::where("id", ">" 0)
->orWhere("number", ">", 2)
->orWhereNull("status")
->get();

或包裝:

$results = Table::where(function($query){
  $query->where("id", ">" 0)
  ->orWhere("number", ">", 2)
  ->orWhereNull("status");
})->get();

如果要查看實際執行的查詢是什么,請將->get()替換為->toSql() ,然后使用dd($result);

$results = Table::where(...)->toSql();
dd($results);

編輯:由於多個條件,聽起來我們需要多個包裝查詢:

$results = Table::where(function($query){
  $query->where("status", "!=", "bad")
  ->where("id", "<", 3); -- "status is not bad and id < 3"
})->orWhere(function($query){
  $query->where("status", "!=", "bad")
  ->where("id", ">", 0); -- "status is not bad and id > 0"
})->get();

如您的注釋中所述,這應該處理成對的情況。

我以前從未使用過laravel,因此我的語法可能會關閉,但是我知道您想為此使用MySQL的ifNull函數:

Table::where([['id', '>', 0], ['number', '>', 2])->whereRaw("IfNull(status, 'blah') <> 'bad'")->get();

暫無
暫無

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

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