लारवेल: सिंटैक्स त्रुटि या एक्सेस उल्लंघन: 1055 त्रुटि


93

मैं रिजल्ट लाने के लिए सेम क्वेरी में व्हॉट्सएप और ग्रुपबी का उपयोग करना चाहता हूं।

मैंने यह कोशिश की है:

$loadids=explode("#@*",$reciptdet->loading_id);
$loadingdatas=DB::table('loading')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();

लेकिन मुझे यह त्रुटि संदेश मिला:

SQLSTATE [४२०००]: सिंटैक्स त्रुटि या पहुंच उल्लंघन: १०५५ 'sbrtpt.loading.id' ग्रुप BY में नहीं है (SQL: select * from loading जहां आईडी से (14, 15, 16) समूह द्वारा vehicle_no


अपने ग्रुप को स्विच करें और जहां पर स्टेटमेंट्स हों
aynber 17

@ काम नहीं कर रहा है @aynber
Karthikvijayaveni 18

क्या आप अपना पूर्ण त्रुटि संदेश प्रिंट कर सकते हैं?
18

SQLSTATE [42000]: सिंटैक्स त्रुटि या पहुंच उल्लंघन: 1055 'sbrtpt.loading.id' ग्रुप BY में नहीं है (SQL: loadingजहां idसे (14, 15, 16) समूह में चयन करें vehicle_no) @aynber
कार्तिकविजयवेनी

जवाबों:


212

संक्षिप्त जवाब

में config\database.php-> "mysql"सरणी

'strict' => falseसभी को अक्षम करने के लिए सेट करें ।

.... या

आप विकल्प में 'strict' => trueमोड छोड़ सकते हैं और जोड़ सकते हैं"mysql"

'mysql' => [
       ...
       ....
       'strict' => true,
       'modes' => [
            //'ONLY_FULL_GROUP_BY', // Disable this to allow grouping by one column
            'STRICT_TRANS_TABLES',
            'NO_ZERO_IN_DATE',
            'NO_ZERO_DATE',
            'ERROR_FOR_DIVISION_BY_ZERO',
            'NO_AUTO_CREATE_USER',
            'NO_ENGINE_SUBSTITUTION'
        ],
 ]

विस्तृत जवाब

आपको सभी सख्त विकल्पों को अक्षम करने की आवश्यकता नहीं हो सकती है ... कृपया इस मुद्दे के बारे में इस उत्तर पर एक नज़र डालें ।


2
एक महान समाधान के लिए धन्यवाद। इस मुद्दे ने मेरे 3 घंटे मारे
Sarower Jahan

हम इस सख्त मोड को लारवल में ओरेकल कनेक्शन पर कैसे सेट कर सकते हैं? कृपया मेरी सहायता करें
विकास चौहान

@VikasChauhan, माफ करना, मैं Oracle से पहले का उपयोग नहीं किया
Husam

3
यह काम किया !!! किसी के लिए भी जो उस सेटिंग को बदलने के बाद भी वही त्रुटि प्राप्त कर रहा है, चलकर कॉन्फिग कैश को क्लीयर करने की कोशिश करेंphp artisan config:cache
Altin

इस तरह के हार्ड-कोडेड वर्कअराउंड के बारे में मेरी चिंता यह है कि मुझे लगता है कि कुछ प्रकार के तकनीकी ऋण हैं जो मुझे रात में अच्छी तरह से सोने नहीं देंगे, क्योंकि मेरे दिमाग में जिस तरह के सवाल तैर रहे होंगे, वह इस प्रकार होगा: क्या होता है जब लारवेल और / या MySQL कल्पना में परिवर्तन होता है modes(उदाहरण के लिए, उस सरणी में निर्दिष्ट कुछ मोडों को हटाना / हटाना, या इससे भी बदतर, उस सरणी परिवर्तनों में निर्दिष्ट किसी एक मोड का नाम)। इसलिए, मैं बस छोड़ता हूं strict=trueऔर किसी भी modeचीज को नहीं छूऊंगा । मैं ऐसी सख्त सेटिंग के साथ काम करने के लिए अपना कोड अपडेट करूंगा। ThisPractice === SleepWellEveryNight:)
दमिलोला ओलोवुकेरे

106

यह संभवतः SQL_MODE समस्या है। आपके config/database.phpसंबंध में, परिवर्तन

strict => false

जैसे की

'mysql' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', 'localhost'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix' => '',
    'strict' => false,
    'engine' => null,
],

1
इस विधि में कोई भी सुरक्षा मुद्दा बना सकते हैं @Antonio कार्लोस रिबेरो
कार्तिकविजयवेनी

मेरा मानना ​​है कि यह सुरक्षित है या आपके पास इसे निष्क्रिय करने के लिए लारवेल पर कोई विकल्प नहीं होगा।
एंटोनियो कार्लोस रिबेरो

10

Config \ database.php फ़ाइल को संशोधित किए बिना

सेट'strict' => false में config\database.phpएक हो सकता है सुरक्षा समस्या । तो, एक सरल लारवेल समाधान पहले कॉल get()और फिरgroupBy('vehicle_no) हो सकता है :

$loadids = explode("#@*", $reciptdet->loading_id);
$loadingdatas = DB::table('loading')->whereIn('id', $loadids)->get();
$grouped = $loadingdatas->groupBy('vehicle_no');

'सख्त' => गलत होने पर मुझे उचित परिणाम नहीं मिला। यदि आप समूह डेटा को क्वेरी के दौरान आज़माते हैं तो यह समाधान अच्छी तरह से काम करता है। जवाब के लिए धन्यवाद।
ईशान पठानी

6

जब भी वाक्पटु में GroupBy का उपयोग कर रहे हों, हमेशा groupBy फ़ंक्शन में सेलेक्ट () फ़ंक्शन में उपयोग किए जाने वाले कॉलम का नाम शामिल करें।

$loadids=explode("#@*",$reciptdet->loading_id);
$loadingdatas=DB::table('loading')->select('vehicle_no')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();//add select('vehicle_no')

साथ ही यह कॉन्फिग फाइल में सख्त मोड को डिसेबल करने के लिए एक बुरा अभ्यास है। ऐसा करने से भ्रष्ट डेटा डेटाबेस में बिना किसी चेतावनी के अमान्य तिथियों के रूप में दर्ज हो सकता है। ऐसा तब तक न करें जब तक कि बिल्कुल आवश्यक न हो।


जोड़ -> चयन ('कॉलम') ने मेरे लिए काम किया। धन्यवाद दोस्त :)
शान

5

मुझे भी यह समस्या हो रही थी 'strict' => true, लेकिन बदलने के बाद 'strict' => false, त्रुटि गायब हो गई।

आप इस सेटिंग को यहां देख सकते हैं:

config \ database.php

'mysql' => [
    ...
    'strict' => false,
    ...
]

हम कैसे कर सकते हैं कि लार्वा में ओरेकल संयोजकता के लिए
विकास चौहान

3

यह प्रतिबंध तब समझ में आता है जब आप GROUP BYMySQL में उपयोग करते हैं , यह उपयोग किए गए कॉलम में प्रत्येक मान के लिए एक पंक्ति देता है GROUP BY। तो, चयनित पंक्तियों में अन्य स्तंभों का मान कहीं भी उपयोग करने के लिए समझ में नहीं आता है। इसलिए, हमेशा सर्वश्रेष्ठ अभ्यास का उपयोग करने की सिफारिश की जाती है और मैं MySQL स्ट्रिक्ट मोड को अक्षम नहीं करने की सलाह दूंगा।

अक्सर डेवलपर्स को स्तंभ के मान द्वारा समूहीकृत क्वेरी की पंक्तियों की आवश्यकता हो सकती है। यहां उन्हें स्तंभों के अनन्य मानों के लिए केवल एक पंक्ति की आवश्यकता नहीं है। लेकिन उन्हें किसी विशेष कॉलम के अद्वितीय मूल्यों द्वारा समूहीकृत कई पंक्तियों की आवश्यकता होती है। किसी कारण से, वे groupByलारवेल की क्वेरी बिल्डर विधि का उपयोग करते हैं जो एक MySQL GROUP BYक्वेरी उत्पन्न करता है और डेवलपर्स उपरोक्त त्रुटि का सामना करते हैं।

उनकी समस्या का हल groupByइसके बजाय संग्रह विधि का उपयोग करना है। उदाहरण के लिए,

$loadingData = DB::table('loading')
    ->whereIn('id', $loadIds)
    ->get()
    ->groupBy('vehicle_no');

यह उन्हें वांछित परिणाम देगा।


3

अपडेट करें config/database.php

सेट:

'mysql' => [
           'strict' => false,
        ],

के बजाय:

'mysql' => [
           'strict' => true,
        ],

और कैश साफ़ करना न भूलें:

php artisan config:cache

बगल में 2016 में उत्तर दिया जा रहा है अगर मैं आपको एक हजार बार वोट दे सकता हूं। लगभग 24 घंटे इसके साथ धमाके किए जाने के बावजूद इसे बंद नहीं किया जा सका। लव
यू

0

आप भी उपयोग कर सकते हैं:

अलग ( 'vehicle_no')

GroupBy ('vehicle_no') के बजाय प्रत्येक मामले का परिदृश्य अलग होता है, लेकिन आपकी क्वेरी को देखते हुए, अलग-अलग तरीके हो सकते हैं क्योंकि आप डेटा एकत्र नहीं कर रहे हैं।


-1

जोड़ने \Schema::defaultStringLength(191);के लिए bootविधि

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
         \Schema::defaultStringLength(191);
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.