Laravel: ข้อผิดพลาดทางไวยากรณ์หรือการละเมิดการเข้าถึง: ข้อผิดพลาด 1055


93

ฉันต้องการใช้ WhereIn และ Groupby ในแบบสอบถามเดียวกันเพื่อดึงผลลัพธ์

ฉันได้ลองแล้ว:

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

แต่ฉันได้รับข้อความแสดงข้อผิดพลาดนี้:

SQLSTATE [42000]: ข้อผิดพลาดทางไวยากรณ์หรือการละเมิดการเข้าถึง: 1055 'sbrtpt.loading.id' ไม่อยู่ใน GROUP BY (SQL: เลือก * จากการโหลดโดยที่ id ใน (14, 15, 16) จัดกลุ่มตาม vehicle_no)


สลับ groupBy และ whereIn งบรอบ
aynber

ไม่ทำงาน @aynber
Karthikvijayaveni

คุณสามารถพิมพ์ข้อความแสดงข้อผิดพลาดทั้งหมดได้หรือไม่?
aynber

SQLSTATE [42000]: ข้อผิดพลาดทางไวยากรณ์หรือการละเมิดการเข้าถึง: 1055 'sbrtpt.loading.id' ไม่อยู่ใน GROUP BY (SQL: select * from loadingwhere idin (14, 15, 16) group by vehicle_no) @aynber
Karthikvijayaveni

คำตอบ:


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
ขอบคุณสำหรับวิธีแก้ปัญหาที่ยอดเยี่ยม ปัญหานี้
คร่า

เราจะตั้งค่าโหมดที่เข้มงวดนี้เป็นเท็จบนการเชื่อมต่อ oracle ใน laravel ได้อย่างไร? โปรดช่วยฉันด้วย
Vikas Chauhan

@VikasChauhan ขออภัยฉันไม่ได้ใช้ Oracle มาก่อน
Husam

3
ได้ผล !!! สำหรับใครก็ตามที่ยังคงได้รับข้อผิดพลาดเดิมหลังจากเปลี่ยนการตั้งค่านั้นให้ลองล้างแคช config โดยเรียกใช้php artisan config:cache
Altin

ความกังวลของฉันเกี่ยวกับวิธีแก้ปัญหาแบบฮาร์ดโค้ดประเภทนี้คือฉันรู้สึกว่ามีหนี้ทางเทคนิคบางอย่างที่จะทำให้ฉันนอนหลับไม่สนิทในตอนกลางคืนเพราะคำถามประเภทที่จะลอยอยู่ในหัวของฉันจะเป็นอย่างไร: จะเกิดอะไรขึ้นเมื่อ Laravel และ / หรือข้อมูลจำเพาะ MySQL เปลี่ยนไปmodes(เช่นการเพิ่ม / ลบโหมดบางโหมดที่ระบุในอาร์เรย์นั้นหรือที่แย่กว่านั้นคือชื่อของโหมดใดโหมดหนึ่งที่ระบุในอาร์เรย์นั้นเปลี่ยนไป) ดังนั้นฉันแค่ออกไปstrict=trueและจะไม่แตะต้องmodeสิ่งใด ๆ ฉันค่อนข้างจะอัปเดตโค้ดของฉันให้ทำงานกับการตั้งค่าที่เข้มงวดเช่นนี้ ThisPractice === SleepWellEveryNight:)
Damilola Olowookere

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 Carlos Ribeiro
Karthikvijayaveni

ฉันเชื่อว่าปลอดภัยไม่งั้นคุณจะไม่มีตัวเลือกใน Laravel เพื่อปิดการใช้งาน
Antonio Carlos Ribeiro

10

โดยไม่ต้องแก้ไขไฟล์ config \ database.php

ตั้ง'strict' => falseอยู่ในconfig\database.phpที่อาจจะเป็นปัญหาด้านความปลอดภัย ดังนั้นวิธีแก้ปัญหา Laravel แบบง่ายๆอาจเป็นครั้งแรกget()จากนั้นgroupBy('vehicle_no) :

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

ฉันไม่ได้ผลลัพธ์ที่ถูกต้องเมื่อ 'เข้มงวด' => เท็จ วิธีนี้จะใช้งานได้ดีถ้าคุณลองจัดกลุ่มข้อมูลเมื่อสอบถาม ขอบคุณสำหรับคำตอบ
ireshan pathirana

6

เมื่อใดก็ตามที่ใช้ groupBy อย่างคมคายให้ใส่ชื่อคอลัมน์ที่ใช้ในฟังก์ชัน groupBy ในฟังก์ชัน select () เสมอ

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

นอกจากนี้ยังเป็นแนวทางปฏิบัติที่ไม่ดีในการปิดโหมดเข้มงวดในไฟล์กำหนดค่า การทำเช่นนั้นอาจทำให้ข้อมูลเสียหายในการเข้าสู่ฐานข้อมูลเช่นวันที่ไม่ถูกต้องโดยไม่มีคำเตือนใด ๆ อย่าทำเช่นนั้นเว้นแต่จำเป็นจริงๆ


การเพิ่ม -> เลือก ('คอลัมน์') ใช้ได้ผลสำหรับฉัน ขอบคุณเพื่อน :)
Shaan

5

ผมมีปัญหานี้ยัง แต่หลังจากการเปลี่ยนแปลง 'strict' => trueที่จะ 'strict' => falseเกิดข้อผิดพลาดหายไป

คุณสามารถค้นหาการตั้งค่านี้ได้ใน:

config \ database.php

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

เราจะทำเช่นนั้นได้อย่างไรสำหรับ Oracle Connectiion ใน Laravel
Vikas Chauhan

3

อัพเดต config/database.php

ชุด:

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

แทน:

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

และอย่าลืมล้างแคช:

php artisan config:cache

นอกเหนือจากการตอบกลับในปี 2559 ถ้าฉันสามารถโหวตคุณได้เป็นพันครั้งฉันจะทำ ต่อสู้กับมันประมาณ 24 ชั่วโมงโดยไม่มีเงื่อนงำใด ๆ ที่ถูกแคช Love you man <3
Faisal Mehmood Awan

2

ข้อ จำกัด นี้ทำให้รู้สึกเมื่อคุณใช้GROUP BYใน MySQL GROUP BYก็จะส่งกลับหนึ่งแถวสำหรับค่าในคอลัมน์ที่ใช้ในแต่ละ ดังนั้นค่าของคอลัมน์อื่น ๆ ในแถวที่เลือกจึงไม่สมเหตุสมผลที่จะใช้ที่ใดก็ได้ ดังนั้นขอแนะนำให้ใช้แนวทางปฏิบัติที่ดีที่สุดเสมอและฉันไม่แนะนำให้ปิดการใช้งาน MySQL Strict Mode

บ่อยครั้งที่นักพัฒนาอาจต้องการแถวของคิวรีที่จัดกลุ่มตามค่าของคอลัมน์ ที่นี่พวกเขาไม่ต้องการเพียงแถวเดียวต่อค่าเฉพาะของคอลัมน์ แต่ต้องมีหลายแถวที่จัดกลุ่มตามค่าเฉพาะของคอลัมน์ใดคอลัมน์หนึ่ง ด้วยเหตุผลบางประการพวกเขาใช้groupByเมธอด Query Builder ของ Laravel ซึ่งสร้างGROUP BYแบบสอบถามMySQL และนักพัฒนาพบข้อผิดพลาดข้างต้น

วิธีแก้ปัญหาคือใช้groupByวิธีการรวบรวมแทน ตัวอย่างเช่น,

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

สิ่งนี้จะทำให้พวกเขาได้ผลลัพธ์ที่ต้องการ


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);
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.