Phalcon ফ্রেমওয়ার্কে PHQL (Phalcon Query Language) একটি শক্তিশালী SQL এর মত ভাষা যা ORM (Object-Relational Mapping) এর মাধ্যমে ডাটাবেসে কাজ করার জন্য ব্যবহৃত হয়। PHQL SQL এর মতোই কাজ করে, তবে এটি Object-Oriented হতে পারে এবং ডাটাবেস টেবিলগুলিকে মডেল ক্লাস হিসেবে উপস্থাপন করে। Phalcon এর PHQL আপনাকে অনেক ধরনের কাস্টম বা জটিল কুয়েরি তৈরি করতে সক্ষম করে।
PHQL একটি SQL এর মতোই syntax ব্যবহার করে তবে এটি SQL এর অনেক কিছু থেকে আলাদা যেমন:
- এটি PHP অবজেক্টের সাথে কাজ করে
- এটি ডাটাবেসের টেবিল নামের পরিবর্তে মডেল ক্লাসের নাম ব্যবহার করে
- এটি SQL ইনজেকশন থেকে রক্ষা করতে সহায়ক
এখানে, আমরা PHQL ব্যবহার করে কিছু complex query তৈরি করার উদাহরণ দেখব।
PHQL দিয়ে Complex Query তৈরি করা
১. JOIN Query ব্যবহার করা
Phalcon-এ PHQL দিয়ে JOIN কুয়েরি করা খুবই সহজ। ধরুন, আমাদের দুটি টেবিল রয়েছে: Users এবং Orders, এবং আমরা চাই যে, একটি ইউজারের সাথে সংশ্লিষ্ট সমস্ত অর্ডারের তথ্য পেতে।
$phql = "SELECT u.id, u.name, o.total_amount
FROM Users u
JOIN Orders o ON o.user_id = u.id
WHERE u.status = :status:";
$usersOrders = $this->modelsManager->executeQuery($phql, [
'status' => 'active'
]);
foreach ($usersOrders as $userOrder) {
echo "User: " . $userOrder->name . " - Order Total: " . $userOrder->total_amount . "<br>";
}
এখানে, Users এবং Orders টেবিলের মধ্যে JOIN করা হয়েছে এবং status প্যারামিটার ব্যবহার করে কেবলমাত্র অ্যাকটিভ ইউজারদের অর্ডার আনা হয়েছে।
২. GROUP BY এবং HAVING ক্লজ ব্যবহার করা
Phalcon এর PHQL দিয়ে GROUP BY এবং HAVING ক্লজ ব্যবহার করা খুব সহজ। ধরুন, আমরা সব ইউজারের অর্ডার টোটাল গ্রুপ করতে চাই এবং যাদের অর্ডার টোটাল ১০০ বা তার বেশি তাদের তালিকা করতে চাই।
$phql = "SELECT u.name, SUM(o.total_amount) AS total_spent
FROM Users u
JOIN Orders o ON o.user_id = u.id
GROUP BY u.name
HAVING total_spent >= 100";
$results = $this->modelsManager->executeQuery($phql);
foreach ($results as $result) {
echo $result->name . " - Total Spent: " . $result->total_spent . "<br>";
}
এখানে, SUM(o.total_amount) ব্যবহার করে প্রতিটি ইউজারের মোট খরচ বের করা হয়েছে এবং HAVING total_spent >= 100 দিয়ে কেবল সেই ইউজারদের রিটার্ন করা হচ্ছে, যারা ১০০ বা তার বেশি খরচ করেছে।
৩. Subquery ব্যবহার করা
Phalcon এর PHQL দিয়ে সাবকুয়েরি ব্যবহার করাও সম্ভব। নিচে একটি উদাহরণ দেখানো হল যেখানে আমরা একটি সাবকুয়েরি ব্যবহার করে ইউজারের সর্বশেষ অর্ডার টোটাল বের করছি।
$phql = "SELECT u.name, (
SELECT o.total_amount
FROM Orders o
WHERE o.user_id = u.id
ORDER BY o.created_at DESC
LIMIT 1
) AS last_order
FROM Users u";
$users = $this->modelsManager->executeQuery($phql);
foreach ($users as $user) {
echo $user->name . " - Last Order: " . $user->last_order . "<br>";
}
এখানে, একটি সাবকুয়েরি ব্যবহার করা হয়েছে যা প্রতিটি ইউজারের সর্বশেষ অর্ডার টোটাল বের করে এবং মূল কুয়েরিতে এটি last_order হিসেবে রিটার্ন করা হচ্ছে।
৪. Distinct Query ব্যবহার করা
যদি আপনি ডুপ্লিকেট ফলাফল এড়াতে চান, তবে DISTINCT কিওয়ার্ড ব্যবহার করতে পারেন। নিচে একটি উদাহরণ দেওয়া হল যেখানে ইউজারদের নাম বের করা হচ্ছে এবং ডুপ্লিকেট নাম বাদ দেওয়া হচ্ছে।
$phql = "SELECT DISTINCT u.name
FROM Users u
WHERE u.status = :status";
$users = $this->modelsManager->executeQuery($phql, [
'status' => 'active'
]);
foreach ($users as $user) {
echo "User: " . $user->name . "<br>";
}
এখানে, DISTINCT কিওয়ার্ড ব্যবহার করে কেবল ইউনিক ইউজার নাম রিটার্ন করা হচ্ছে।
৫. Order By ব্যবহার করা
Phalcon এর PHQL এ ORDER BY ব্যবহার করে আপনি রেকর্ডগুলো নির্দিষ্ট একটি অর্ডারে সাজাতে পারেন। নিচে একটি উদাহরণ দেখানো হয়েছে যেখানে ইউজারদের অর্ডার করা হচ্ছে নাম অনুযায়ী।
$phql = "SELECT u.name, u.email
FROM Users u
ORDER BY u.name ASC";
$users = $this->modelsManager->executeQuery($phql);
foreach ($users as $user) {
echo "User: " . $user->name . " - Email: " . $user->email . "<br>";
}
এখানে, ORDER BY u.name ASC ব্যবহার করা হয়েছে যা ইউজারদের নাম অনুযায়ী অ্যাসেন্ডিং অর্ডারে সাজাচ্ছে।
সারাংশ
Phalcon এর PHQL আপনাকে SQL এর মতো কোয়েরি তৈরি করতে দেয়, তবে এটি মডেল ভিত্তিক এবং ORM (Object-Relational Mapping) এর মাধ্যমে কাজ করে। PHQL ব্যবহার করে আপনি বিভিন্ন ধরনের জটিল কুয়েরি তৈরি করতে পারেন, যেমন JOIN, GROUP BY, HAVING, DISTINCT, ORDER BY, সাবকুয়েরি ইত্যাদি। এটি ডেভেলপারদের ডাটাবেস অপারেশনগুলি আরও সহজ, নিরাপদ এবং দ্রুত করতে সহায়ক। PHQL এর ব্যবহার আপনাকে SQL ইনজেকশন থেকে সুরক্ষিত রাখে এবং কোডে অপ্রয়োজনীয় SQL কোড পুনরাবৃত্তি কমায়।
Read more