2017-09-05 162 views
1

所以在Laravel 5有一個名爲JSON WHERE子句使用MySQL的新能力,存儲和獲取JSON存儲在列得心應手的事情:選擇,其中JSON數組包含

User::where('meta->colors', 'red')->get() 

將返回所有行,其中colorsmeta將被設置爲red

現在讓我們假設colors不是一個字符串,而是一個包含多種顏色的數組(colors => ['red', 'blue', 'green'])。

什麼是檢索所有行的有效方式,其中colors包含例如價值red

+0

您的意思是$ x = ['red','blue','green'];或$ x =(colors => ['red','blue','green'])? –

+0

你試過WhereIn條件嗎? –

+0

澄清:用戶有一個屬性/列,可以說它叫'meta',它包含以下JSON: '''{color}「:[」red「,」blue「,」green「] }''' 我想檢索它,如果'colors'包含值'red'。 – Elwin

回答

0

whereIn方法驗證給定列的值是否包含在給定數組中。 試試這個:

$colorArray = ['red', 'blue', 'green']; 

$user = User::whereIn('meta->color', $colorArray)->get(); 

更多Laravel's whereIn

+0

我的意思基本上是其他方式:用戶對象包含一個數組,並且我想檢索它,如果_user_包含給定的值。 – Elwin

+0

OP所尋找的與「whereIn」產生的結果完全不同。看[why](https://stackoverflow.com/a/46289938/65732)。 – sepehr

0

我覺得一個方法是使用運營商like

User::where('meta->colors', 'like', '%"red"%')

但是如果值永遠不會包含字符"和分隔符不會改變這隻會工作。

2

JSON_CONTAINS()不正是你要尋找的:

JSON_CONTAINS(target, candidate[, path])

表示通過返回1或0是否給定候選JSON文件包含一個目標JSON文件中,或 - 如果提供了路徑參數 - 是否在目標中的特定路徑上找到候選者。 - 12.16.3 Functions That Search JSON Values

當前,Laravel的查詢構建器不提供相應的API。有一個open internals proposal雖然。

在此期間,您可以執行原始查詢:

\DB::table('users')->whereRaw(
    'JSON_CONTAINS(meta->"$.colors", \'["red"]\')' 
)->get(); 

這將返回在其meta->colors JSON場「紅色」的所有用戶。請注意,-> operator需要MySQL 5.7.9+。

您也可以直接在Eloquent模型上調用whereRaw()

+0

如何用數組變量替換這個[「red」]? –

+0

這已經是一個數組,你可以添加項目。查看'JSON_CONTAINS'文檔以獲取更多信息。 – sepehr