Header Ads

Header ADS

Laravel Ecosystem + Almost in Any other ORM Ecosystems

 নিচে থাকা স্ক্রিনশটে যে ইস্যুটা দেখানো হয়েছে, আজকে সেটার কারনে Production Server থেকে Error এসেছে! QA চোখকে ফাকি দিয়েও বেটা পার পেয়ে গেছে!

যদিওবা, এই সমস্যা নিয়ে আমাদের কমিউনিটির কমবেশি সিনিয়র সকলেই আলোচনা করেছেন এবং করেন! তারপরেও, দেখা যায় আমরা এই ভুলটি করি! এটি খুবই Well-known সমস্যা আমাদের Laravel Ecosystem + Almost in Any other ORM Ecosystems ।
Eloquent Query লেখার সময় আমাদের প্রায়ই "OR", "AND" এর ব্যবহার করতে হয়। এখানে অতি সাধারণ একটি সমস্যা হয় যখন আমরা একটি Condition Match হবার পরে গিয়ে অন্যগুলো Match করাতে চাই। কিন্তু, সঠিকভাবে Condition Grouping করি না!
এখানে আমি ঠিক এমনই ভুল করেছিলাম! আমাদের দরকার ছিলো, phone_number অথবা email যেকোনো একটি বা দুইটিই দিয়ে একটি Tenant এর Employee Profiles অলরেডি এক্সিস্ট করে কিনা তা জানা। কিন্তু, আমার কন্ডিশন সঠিক গ্রুপিং না করাতে, SQL Query Generate হচ্ছিলো এমনঃ-
SELECT EXISTS (
SELECT *
FROM users
WHERE tenant_id = ?
AND phone_number = ?
OR email = ?
);
অর্থাৎ, এখানে আগে চেক দিচ্ছে, tenant_id এবং phone_number একসাথে match করে কিনা! যদি না করে, তাহলে শুধু email match করে কিনা! তো দেখা যাচ্ছে, এই কুয়েরি employee_profiles Table এ Email Match করে এমন Row থাকলেই Always "true" return করবে! এক্ষেত্রে, ঐ "OR" Operator এর গ্রুপিং বাদে ব্যবহার করার কারনে, Employee Profile ঐ Tenant এর হোক বা না হোক তাতে কোন সমস্যা হবে না!
অথচ আমাদের আসলে দরকার ছিল এমনটাঃ-
SELECT EXISTS (
SELECT *
FROM users
WHERE tenant_id = ?
AND (phone_number = ? OR email = ?)
);
এখন এটি আগে চেক করবে Employee Profiles গুলা ঐ Tenant এর কিনা। যদি হয়, পরে চেক করবে সেগুলোর phone_number অথবা email যেকোনো একটা Field ম্যাচ করে কিনা!
আশাকরি সামনে এধরনের ভুল থেকে আপনি সতর্ক থাকবেন!



No comments

Theme images by fpm. Powered by Blogger.