ডকট্রিন ওআরএম ক্যোয়ারীতে ট্যাগ-ভিত্তিক ফিল্টারিং আয়ত্ত করা
কল্পনা করুন যে আপনি একটি উদ্ধৃতি অনুসন্ধান বৈশিষ্ট্য তৈরি করছেন যেখানে ব্যবহারকারীরা একাধিক ট্যাগ ব্যবহার করে ফলাফলগুলি ফিল্টার করতে পারে। 🏷️ প্রথমে, এটা সোজা মনে হয়—আপনি একটি প্রশ্ন লিখুন, টেবিলে যোগ দিন এবং ফলাফল আশা করুন। যাইহোক, যখন আপনি একাধিক ট্যাগ যোগ করেন, কোয়েরিটি খালি ফলাফল দিতে শুরু করে বা অপ্রত্যাশিতভাবে আচরণ করে।
MyToMany সম্পর্ক নিয়ে কাজ করার সময় এটি ডকট্রিন ORM-এ ডেভেলপারদের মুখোমুখি হওয়া একটি সাধারণ চ্যালেঞ্জ। একাধিক ট্যাগ দ্বারা ফিল্টার করার জন্য নির্ভুলতা প্রয়োজন, বিশেষ করে যখন WHERE শর্ত এবং AND বা IN এর মতো লজিক্যাল ক্রিয়াকলাপ একত্রিত করা হয়। সঠিক পন্থা ছাড়া, আপনি ধারাবাহিক ফলাফল পেতে সংগ্রাম করতে পারেন।
একটি সাম্প্রতিক প্রকল্পে, আমি এই সঠিক সমস্যা সম্মুখীন. একজন ব্যবহারকারীকে শুধুমাত্র একটি নয়, সমস্ত নির্বাচিত ট্যাগ সমন্বিত উদ্ধৃতিগুলি অনুসন্ধান করতে হবে৷ আমি AND শর্তাবলী এবং IN() ধারাগুলি চেষ্টা করেছি, কিন্তু ক্যোয়ারী লজিক ডকট্রিনের ক্যোয়ারী নির্মাতার সাথে ভাল খেলতে পারেনি। আমি সমাধান খুঁজে না পাওয়া পর্যন্ত এটা আমার মাথা scratching বাকি. 💡
এই প্রবন্ধে, ডকট্রিন ওআরএম ব্যবহার করে ManyToMany সম্পর্কে প্রশ্নগুলিকে কীভাবে সংকুচিত করা যায় তা আমি আপনাকে তুলে ধরব। আপনি "AND" যুক্তি দিয়ে একাধিক ট্যাগ দ্বারা ফিল্টার করছেন বা কাস্টম ক্যোয়ারী লজিক দিয়ে কাজ করছেন না কেন, এটি কার্যকরভাবে কার্যকর করতে আপনাকে সাহায্য করার জন্য আমি একটি পরিষ্কার, কার্যকর উদাহরণ শেয়ার করব৷ এর মধ্যে ডুব দেওয়া যাক! 🚀
আদেশ | ব্যবহারের উদাহরণ |
---|---|
QueryBuilder তৈরি করুন | ডকট্রিন প্রশ্ন তৈরি এবং ম্যানিপুলেট করতে ব্যবহৃত হয়। এটি অবজেক্ট-ওরিয়েন্টেড কোড ব্যবহার করে গতিশীল প্রশ্ন তৈরি করার একটি নমনীয় উপায় প্রদান করে। |
বাম যোগদান | একটি ManyToMany সম্পর্ক থেকে ফিল্টারিং বা ডেটা অ্যাক্সেস করার অনুমতি দিতে মূল সত্তার সাথে সম্পর্কিত টেবিলে (যেমন, ট্যাগ টেবিল) যোগদান করে। |
expr()->expr()->এবংএক্স() | যৌক্তিক AND এর সাথে একাধিক শর্ত একত্রিত করে। ফিল্টারিং ফলাফলের জন্য দরকারী যা একই সাথে সমস্ত ট্যাগ মানদণ্ড পূরণ করে। |
expr()->expr()->eq() | নির্দিষ্ট করে যে একটি ক্ষেত্র একটি নির্দিষ্ট মানের সমান হতে হবে। প্রায়শই নির্দিষ্ট ট্যাগ আইডি মেলানোর জন্য ব্যবহৃত হয়। |
সেট প্যারামিটার | একটি ক্যোয়ারী স্থানধারকের সাথে একটি মান আবদ্ধ করে, ডেটা নিরাপত্তা নিশ্চিত করে এবং SQL ইনজেকশন ঝুঁকি এড়ায়। |
এবং কোথায় | AND লজিকের সাথে সমন্বয় করে, গতিশীলভাবে ক্যোয়ারীতে শর্ত যোগ করে। |
সেট ফার্স্ট ফলাফল | পেজিনেশনের জন্য অফসেট সেট করতে ব্যবহৃত হয়, নিশ্চিত করে যে ফলাফলগুলি একবারে না হয়ে খণ্ডে প্রদর্শিত হয়। |
সেট ম্যাক্স ফলাফল | পুনরুদ্ধার করার জন্য সর্বাধিক সংখ্যক ফলাফল নির্দিষ্ট করে, যা ক্যোয়ারী কর্মক্ষমতা অপ্টিমাইজ করতে সাহায্য করে। |
গ্রুপ করে... কাউন্ট আছে | ফলাফলগুলিকে গোষ্ঠীবদ্ধ করে এবং ট্যাগ গণনার শর্ত পূরণ করে এমন গোষ্ঠীগুলিকে ফিল্টার করে সমস্ত নির্বাচিত ট্যাগ রয়েছে তা নিশ্চিত করে৷ |
আনুন() | একটি API অনুরোধের মাধ্যমে গতিশীলভাবে ব্যাকএন্ডে ডেটা (নির্বাচিত ট্যাগ) পাঠাতে সামনের প্রান্তে ব্যবহৃত হয়। |
ট্যাগ ব্যবহার করে ডকট্রিন ওআরএম-এ উদ্ধৃতিগুলি কীভাবে ফিল্টার করবেন
ব্যাকএন্ডে, দ্বারা উদ্ধৃতিগুলি ফিল্টার করা একাধিক ট্যাগ ManyToMany সম্পর্কের সাথে কাজ করার সময় যত্নশীল ক্যোয়ারী বিল্ডিং প্রয়োজন। স্ক্রিপ্টটি `createQueryBuilder` পদ্ধতি ব্যবহার করে তৈরি একটি ক্যোয়ারী বিল্ডার দিয়ে শুরু হয়। এখানে ভিত্তি সত্তা (`উদ্ধৃতি`) নির্বাচন করা হয়। ট্যাগগুলির উপর ভিত্তি করে উদ্ধৃতিগুলি ফিল্টার করতে, `leftJoin` কমান্ডটি `ট্যাগ` সত্তাকে উদ্ধৃতি সারণীতে সংযুক্ত করে, যা আমাদের সংশ্লিষ্ট ট্যাগের শর্তাবলী প্রয়োগ করার অনুমতি দেয়। ব্যবহারকারী যদি অথবা যুক্তি ব্যবহার করে ফিল্টার করার অনুরোধ করে, আমরা নির্বাচিত ট্যাগের সাথে উদ্ধৃতি মেলাতে `IN()` ধারাটি ব্যবহার করি।
However, in cases where quotes need to match all the provided tags (AND logic), the `expr()->andX()` method comes into play. This method lets us add multiple equality conditions using `expr()->যাইহোক, যে ক্ষেত্রে উদ্ধৃতিগুলি প্রদত্ত সমস্ত ট্যাগ (AND লজিক) এর সাথে মেলে, `expr()->andX()` পদ্ধতি কার্যকর হয়। এই পদ্ধতিটি আমাদেরকে `expr()->eq()` ব্যবহার করে একাধিক সমতা শর্ত যোগ করতে দেয়, যেখানে প্রতিটি ট্যাগ আইডি অবশ্যই একটি সম্পর্কিত ট্যাগের সাথে মেলে। ক্যোয়ারী নিশ্চিত করে যে সমস্ত নির্দিষ্ট ট্যাগ সম্বলিত উদ্ধৃতিগুলিই ফেরত দেওয়া হয়েছে৷ এই পদ্ধতিটি সাধারণ সমস্যার সমাধান করে যেখানে একাধিক ট্যাগ দ্বারা ফিল্টারিং অনুপযুক্ত ক্যোয়ারী নির্মাণের কারণে কোন ফলাফল দেয় না।
সামনের প্রান্তে, JavaScript ফেচ ফাংশন গতিশীলভাবে ব্যবহারকারীর নির্বাচিত ট্যাগগুলিকে ব্যাকএন্ডে পাঠায়। উদাহরণস্বরূপ, ব্যবহারকারী যদি 88 এবং 306 ট্যাগগুলি নির্বাচন করেন, তাহলে এই আইডিগুলিকে JSON অনুরোধে অন্তর্ভুক্ত করা হয়েছে৷ ব্যাকএন্ড এই অনুরোধটি প্রক্রিয়া করে, উপযুক্ত শর্তের সাথে ক্যোয়ারী তৈরি করে এবং ফিল্টার করা ফলাফল প্রদান করে। এই দ্বি-মুখী মিথস্ক্রিয়া একটি মসৃণ ব্যবহারকারীর অভিজ্ঞতা নিশ্চিত করে যেখানে ব্যবহারকারীর ইনপুটের উপর ভিত্তি করে অনুসন্ধান গতিশীলভাবে আপডেট হয়। 🚀
উন্নত ক্যোয়ারী পারফরম্যান্সের জন্য, ট্যাগগুলি সঠিকভাবে মেলে তা নিশ্চিত করতে `GROUP BY` এবং `HAVING COUNT`-এর মতো SQL কমান্ড সরাসরি ব্যবহার করা যেতে পারে। উদ্ধৃতিগুলিকে গোষ্ঠীবদ্ধ করে এবং তাদের সাথে সম্পর্কিত স্বতন্ত্র ট্যাগগুলি গণনা করে, ক্যোয়ারী ট্যাগ গণনার মানদণ্ড পূরণ করে না এমন কোনও উদ্ধৃতি ফিল্টার করে। উপরন্তু, `setFirstResult` এবং `setMaxResults`-এর ব্যবহার যথাযথ পেজিনেশন নিশ্চিত করে, যা বড় ডেটাসেট পরিচালনা করার সময় কর্মক্ষমতা উন্নত করে। এই পদ্ধতিটি এমন পরিস্থিতিতে ভাল কাজ করে যেখানে ব্যবহারকারীরা উদ্ধৃতিগুলির একটি বড় পুলের মধ্যে নির্দিষ্ট, ফিল্টার করা ফলাফলগুলি অনুসন্ধান করে। 😊
মতবাদ ওআরএম: একাধিক ট্যাগ দিয়ে অনেক অনেক সম্পর্ক ফিল্টার করা
পিএইচপি এবং ডকট্রিন ওআরএম ব্যবহার করে ব্যাকএন্ড বাস্তবায়ন
// 1. Backend PHP solution to filter results using multiple tags in Doctrine ORM
$search = $request->request->all()['quote_search'];
$queryBuilder = $this->createQueryBuilder('q');
// Check if tag mode and tags are set
if ($search['tagMode'] != -1 && !empty($search['tags'])) {
$queryBuilder->leftJoin('q.tags', 't');
if ($search['tagMode'] == 1000) { // OR logic using IN()
$queryBuilder->setParameter("tags", $search['tags']);
$queryBuilder->andWhere("t.id IN (:tags)");
} else if ($search['tagMode'] == 2000) { // AND logic for multiple tags
$andExpr = $queryBuilder->expr()->andX();
foreach ($search['tags'] as $tagId) {
$andExpr->add($queryBuilder->expr()->eq("t.id", $tagId));
}
$queryBuilder->andWhere($andExpr);
}
}
// Set pagination and ordering
$queryBuilder
->orderBy('q.id', 'ASC')
->setFirstResult($page * $limit)
->setMaxResults($limit);
$quotes = $queryBuilder->getQuery()->getResult();
একাধিক ট্যাগ সহ কোট ফিল্টার করার জন্য উন্নত SQL কোয়েরি
অপ্টিমাইজ করা ডাটাবেস ফিল্টারিংয়ের জন্য কাঁচা SQL ক্যোয়ারী
SELECT q.id, q.content
FROM quote q
JOIN quote_tag qt ON q.id = qt.quote_id
JOIN tag t ON t.id = qt.tag_id
WHERE t.id IN (88, 306)
GROUP BY q.id
HAVING COUNT(DISTINCT t.id) = 2
ORDER BY q.id ASC
LIMIT 10 OFFSET 0;
একাধিক ট্যাগ পাস করার জন্য জাভাস্ক্রিপ্ট ফ্রন্ট-এন্ড সলিউশন
নির্বাচিত ট্যাগ পাঠানোর জন্য ফ্রন্টএন্ড বাস্তবায়ন
// Assume user selects tags and submits the form
const selectedTags = [88, 306];
const tagMode = 2000; // AND mode
const data = {
quote_search: {
tagMode: tagMode,
tags: selectedTags
}
};
// Send tags to the backend via fetch
fetch('/quotes/filter', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
PHPUnit এ মতবাদ প্রশ্নের জন্য ইউনিট পরীক্ষা
ক্যোয়ারী যুক্তি যাচাই করার জন্য PHPUnit পরীক্ষা
use PHPUnit\Framework\TestCase;
use Doctrine\ORM\EntityManager;
class QuoteRepositoryTest extends TestCase {
public function testFilterQuotesByMultipleTags() {
$entityManager = $this->createMock(EntityManager::class);
$repo = new QuoteRepository($entityManager);
$search = [
'tagMode' => 2000,
'tags' => [88, 306]
];
$quotes = $repo->filterByTags($search, 0, 10);
$this->assertNotEmpty($quotes);
foreach ($quotes as $quote) {
$this->assertContains(88, $quote->getTagIds());
$this->assertContains(306, $quote->getTagIds());
}
}
}
মতবাদ ওআরএম: অনেকগুলো ক্যোয়ারী ফিল্টার করার জন্য কমান্ড এবং ধারণা
জটিল ট্যাগ-ভিত্তিক প্রশ্নের জন্য মতবাদ ORM অপ্টিমাইজ করা
সাথে কাজ করার সময় অনেক অনেক সম্পর্ক ডকট্রিন ওআরএম-এ, একটি উপেক্ষিত দিক হল ক্যোয়ারী অপ্টিমাইজেশন। যদিও 'AND' বা 'IN' ব্যবহার করা মৌলিক ফিল্টারগুলি ছোট ডেটাসেটে যথেষ্ট, ডেটাবেস বৃদ্ধির সাথে সাথে কর্মক্ষমতা হ্রাস পেতে পারে। দক্ষতার সাথে সঠিক ফলাফল ফেরত দেওয়ার জন্য প্রশ্নগুলিকে অপ্টিমাইজ করা গুরুত্বপূর্ণ হয়ে ওঠে। উদাহরণস্বরূপ, একাধিক ট্যাগ দ্বারা উদ্ধৃতিগুলি ফিল্টার করার সময়, সম্পর্কিত টেবিলে সূচীকরণ যোগ করা (যেমন, `উদ্ধৃতি_ট্যাগ` এবং `ট্যাগ`) কোয়েরি সম্পাদনের সময়কে উল্লেখযোগ্যভাবে হ্রাস করতে পারে। সঠিক সূচীকরণ ছাড়া, ডাটাবেস সম্পূর্ণ স্ক্যান করে, যা সম্পদের পরিপ্রেক্ষিতে ব্যয়বহুল।
Another crucial optimization is reducing unnecessary joins. For example, when you only need quote IDs that match all selected tags, you can retrieve IDs with a single query using `GROUP BY` and `HAVING COUNT`. This avoids fetching entire rows and minimizes memory usage. Additionally, the query builder’s `expr()->আরেকটি গুরুত্বপূর্ণ অপ্টিমাইজেশন হল অপ্রয়োজনীয় যোগদান কমানো। উদাহরণস্বরূপ, যখন আপনার শুধুমাত্র উদ্ধৃতি আইডির প্রয়োজন হয় যা সমস্ত নির্বাচিত ট্যাগের সাথে মেলে, আপনি `GROUP BY` এবং `HAVING COUNT` ব্যবহার করে একটি একক ক্যোয়ারী দিয়ে আইডি পুনরুদ্ধার করতে পারেন। এটি সম্পূর্ণ সারি আনা এড়ায় এবং মেমরি ব্যবহার কমিয়ে দেয়। উপরন্তু, ক্যোয়ারী নির্মাতার `expr()->andX()` পদ্ধতিটি বড় আকারের ফিল্টারিংয়ের জন্য অপ্টিমাইজ করা কাঁচা SQL দিয়ে প্রতিস্থাপিত করা যেতে পারে। একই কার্যকারিতা অর্জন করার সময় কাঁচা এসকিউএল ব্যবহার করা কখনও কখনও ডকট্রিন ওভারহেডকে বাইপাস করতে পারে।
ডকট্রিনের ক্যাশিং মেকানিজম হল ট্যাগ-ভিত্তিক ফিল্টারিং অপ্টিমাইজ করার আরেকটি টুল। ফলাফল ক্যাশে সক্ষম করে, অভিন্ন অবস্থার সাথে বারবার অনুসন্ধানগুলি ক্যোয়ারী পুনরায় কার্যকর করা এড়ায়। এটি এমন পরিস্থিতিতে বিশেষভাবে কার্যকর যেখানে ডেটা ঘন ঘন পরিবর্তন হয় না। এই কৌশলগুলি একত্রিত করা-ইনডেক্সিং, ক্যোয়ারী অপ্টিমাইজেশান, এবং ক্যাশিং- নিশ্চিত করে যে ফিল্টারিং ট্যাগগুলির জন্য ManyToMany ক্যোয়ারীগুলি দ্রুত এবং মাপযোগ্য থাকে৷ এই কৌশলগুলির যথাযথ বাস্তবায়ন বিকাশকারীদের অ্যাপ্লিকেশন এবং ডাটাবেস বৃদ্ধির সাথে সাথে বাধাগুলি এড়াতে সহায়তা করে। 🚀
Doctrine ORM Tag Query সম্পর্কিত প্রায়শ জিজ্ঞাসিত প্রশ্নাবলী
- কি expr()->andX() জন্য ব্যবহৃত পদ্ধতি?
- দ expr()->andX() পদ্ধতিটি ডকট্রিন কোয়েরি বিল্ডারে গতিশীলভাবে AND লজিকের সাথে একাধিক শর্ত একত্রিত করার অনুমতি দেয়।
- আমি কিভাবে মতবাদের সাথে ManyToMany প্রশ্নগুলিকে অপ্টিমাইজ করতে পারি?
- ব্যবহার করুন GROUP BY এবং HAVING COUNT মাল্টি-ট্যাগ ফিল্টারিংয়ের জন্য, ডাটাবেস ইনডেক্সিং সক্ষম করুন এবং বারবার প্রশ্নের জন্য ডকট্রিন ক্যাশিং সক্রিয় করুন।
- একাধিক ট্যাগ দ্বারা ফিল্টার করার সময় কেন আমার ক্যোয়ারী কোন ফলাফল দেয় না?
- এটি ঘটে কারণ AND লজিকের সাথে ট্যাগগুলিকে একত্রিত করার জন্য প্রতিটি রেকর্ডের সমস্ত ট্যাগের সাথে মেলে। ব্যবহার করুন expr()->andX() সঠিকভাবে বা কাঁচা এসকিউএল দিয়ে অপ্টিমাইজ করুন।
- আমি কিভাবে আমার মতবাদের প্রশ্নে পৃষ্ঠা সংখ্যা যোগ করতে পারি?
- ব্যবহার করুন setFirstResult() এবং setMaxResults() ফলাফল অফসেট এবং সীমা নিয়ন্ত্রণ করার জন্য আপনার ক্যোয়ারী নির্মাতার পদ্ধতি।
- ডকট্রিন কোয়েরি ক্যাশ করার সুবিধা কী?
- ক্যাশে ফলাফল ব্যবহার করে Doctrine Cache, আপনি ব্যয়বহুল প্রশ্নগুলি পুনরায় চালানো এড়ান, বারবার অনুসন্ধানের জন্য অ্যাপ্লিকেশন কর্মক্ষমতা উন্নত করুন৷
- ডকট্রিন ওআরএম-এ আমি কীভাবে সম্পর্কিত সত্তাগুলিতে যোগ দিতে পারি?
- ব্যবহার করুন leftJoin() বা innerJoin() ফিল্টারিংয়ের জন্য সম্পর্কিত টেবিল এবং অ্যাক্সেস ডেটা সংযোগ করার পদ্ধতি।
- ক্যোয়ারী বিল্ডারের পরিবর্তে ডকট্রিনে কি কাঁচা এসকিউএল ব্যবহার করা যেতে পারে?
- হ্যাঁ, মতবাদ কাঁচা SQL এর সাথে অনুমতি দেয় createNativeQuery(). এটি জটিল প্রশ্নের জন্য দরকারী যে ক্যোয়ারী নির্মাতা অপ্টিমাইজ করার জন্য সংগ্রাম করে।
- আমি কিভাবে ব্যবহারকারীদের থেকে ট্যাগ ইনপুট যাচাই করতে পারি?
- ব্যবহারকারীর ইনপুট স্যানিটাইজ করুন এবং প্যারামিটারগুলি ব্যবহার করে আবদ্ধ করুন setParameter() এসকিউএল ইনজেকশন প্রতিরোধ এবং ডেটা নিরাপত্তা নিশ্চিত করতে।
- মধ্যে পার্থক্য কি AND এবং IN() ট্যাগ ফিল্টারিং এ?
- ব্যবহার করে IN() যে কোনো ট্যাগের সাথে মিলে যাওয়া রেকর্ড আনয়ন করে AND যুক্তি নিশ্চিত করে যে সমস্ত ট্যাগ অবশ্যই একটি রেকর্ডে উপস্থিত থাকতে হবে।
- আমি কীভাবে ধীর মতবাদের প্রশ্নগুলির সমস্যা সমাধান করতে পারি?
- এর মতো টুল ব্যবহার করুন EXPLAIN এসকিউএল-এ ক্যোয়ারী কর্মক্ষমতা বিশ্লেষণ করতে এবং অনুপস্থিত সূচক বা অদক্ষ যোগদানের জন্য পরীক্ষা করুন।
- কাঁচা এসকিউএল বা ডকট্রিন কোয়েরি বিল্ডার ব্যবহার করা কি ভাল?
- সহজ প্রশ্নের জন্য, query builder যথেষ্ট, কিন্তু জটিল ফিল্টারিংয়ের জন্য, কাঁচা এসকিউএল আরও অপ্টিমাইজ করা এবং দক্ষ হতে পারে।
মতবাদ ওআরএম-এ অনুসন্ধানের দক্ষতা পরিমার্জন করা
একটিতে একাধিক ট্যাগ ব্যবহার করে উদ্ধৃতি ফিল্টার করা অনেক অনেক সম্পর্ক যত্নশীল ক্যোয়ারী নির্মাণ প্রয়োজন. যৌক্তিক এবং শর্তগুলিকে একত্রিত করে, ডাটাবেসকে সূচীকরণ করে এবং পেজিনেশন পদ্ধতিগুলি ব্যবহার করে, আপনি কর্মক্ষমতার সাথে আপোস না করে সঠিক এবং দক্ষ ফলাফল নিশ্চিত করেন।
যখন চ্যালেঞ্জের সম্মুখীন হয়, যেমন খালি ফলাফল ফেরত দেওয়া, কৌশলগুলি ব্যবহার করে সূক্ষ্ম-টিউনিং প্রশ্নগুলি expr()->expr()->এবংএক্স() অথবা কাঁচা SQL এ স্যুইচ করা একটি পার্থক্য করতে পারে। জটিল ক্যোয়ারী লজিক সহজ করার সময় এই সমাধানগুলি স্কেলেবিলিটি এবং ব্যবহারকারীর সন্তুষ্টি নিশ্চিত করে। শুভ কোডিং! 😊
সূত্র এবং তথ্যসূত্র
- ডকট্রিন ORM-এর সাথে ManyToMany সম্পর্ক ফিল্টার করার জন্য সমাধানগুলি বিশদভাবে বর্ণনা করে৷ সম্পর্কিত আলোচনা এবং সমাধান খুঁজুন স্ট্যাক ওভারফ্লো .
- মতবাদ QueryBuilder পদ্ধতি বোঝার জন্য রেফারেন্স মত expr()->expr()->এবংএক্স() এবং উন্নত এসকিউএল যোগদান করে: মতবাদ ORM ডকুমেন্টেশন .
- ডাটাবেস ক্যোয়ারীতে ব্যাখ্যা করা ট্যাগ সহ AND ফিল্টারিংয়ের বাস্তব-বিশ্ব ব্যবহারের ক্ষেত্রে: Baeldung JPA গাইড .