आपकी क्वेरी में कुछ भी गलत नहीं है। यह आपका परिवेश है।
समस्या
लारवेल का MySqlGrammar
फ़ील्ड->कुंजी
. का अनुवाद करता है फ़ील्ड->'$.key'
. में फ़ील्ड नामों में (लारावेल की ओर) संकेतन -स्टाइल एक्सट्रैक्शन (MySQL की तरफ):
/**
* Wrap the given JSON selector.
*
* @param string $value
* @return string
*/
protected function wrapJsonSelector($value)
{
$path = explode('->', $value);
$field = $this->wrapValue(array_shift($path));
$path = collect($path)->map(function ($part) {
return '"'.$part.'"';
})->implode('.');
// Here:
return sprintf('%s->\'$.%s\'', $field, $path);
}
मैंने अभी पुष्टि की है कि मारियाडीबी ->
निष्कर्षण ऑपरेटर
JSON_EXTRACT ()
समारोह। हालाँकि, वही क्वेरी वैनिला MySQL 5.7 सर्वर के विरुद्ध काम करती है।
यह मानते हुए परीक्षण
तालिका:
╔════╤══════════════════╗
║ id │ payload ║
╟────┼──────────────────╢
║ 1 │ {"a": 1, "b": 2} ║
╚════╧══════════════════╝
एक क्वेरी जो ->
. का उपयोग करती है निष्कर्षण ऑपरेटर:
SELECT payload->"$.b" FROM test;
मारियाडीबी 10.2.8 के खिलाफ विफल रहता है जबकि यह एक सही 2
. उत्पन्न करता है एक MySQL 5.7.19 सर्वर के विरुद्ध।
समाधान
सही समाधान इस बात पर निर्भर करता है कि आप उत्पादन पर क्या उपयोग कर रहे हैं।
MariaDB बदलें
यदि आप MySQL का उपयोग कर रहे हैं, तो अपने विकास वातावरण में MariaDB को MySQL से बदलें। Homebrew द्वारा प्रबंधित macOS मशीन पर, यह इतना आसान होगा:
brew services stop mysql
brew uninstall mariadb
brew install mysql
brew services start mysql
आपका डेटा बरकरार रहेगा।
अपने प्रश्नों को फिर से लिखें
हालांकि, यदि आप उत्पादन में मारियाडीबी का उपयोग कर रहे हैं, तो आपको JSON_EXTRACT()
का उपयोग करने के लिए अपने प्रश्नों को फिर से लिखना होगा। एलियास का पहले ही उल्लेख किया गया है
के रूप में कार्य करें . जैसा कि आप देख सकते हैं कि आपको लारवेल एपीआई के साथ बहुत अधिक क्रियात्मक होने की आवश्यकता है।
उपरोक्त प्रश्न होगा:
परीक्षण सेSELECT JSON_EXTRACT(payload, "$.b") FROM test;