আমি ধারণা পাওয়া যায় এবং এই পদ্ধতি পিছনে অর্থ একটু বিভ্রান্তিকর হতে করেছেন, এটা কেউ আমাকে বুঝিয়ে বলতে পারেন সম্ভব কি মধ্যে পার্থক্য has
এবং with
একটি উদাহরণ প্রেক্ষাপটে (সম্ভব হলে) এ, কে?
আমি ধারণা পাওয়া যায় এবং এই পদ্ধতি পিছনে অর্থ একটু বিভ্রান্তিকর হতে করেছেন, এটা কেউ আমাকে বুঝিয়ে বলতে পারেন সম্ভব কি মধ্যে পার্থক্য has
এবং with
একটি উদাহরণ প্রেক্ষাপটে (সম্ভব হলে) এ, কে?
উত্তর:
with()
জন্য উৎসুক লোড । মূলত এর অর্থ হ'ল মূল মডেলটি বরাবর, লারাভেল আপনার নির্দিষ্ট করা সম্পর্কের (গুলি) প্রিলোড করবে। এটি বিশেষত সহায়ক যদি আপনার কাছে মডেলগুলির একটি সংগ্রহ থাকে এবং আপনি তাদের সকলের জন্য একটি সম্পর্ক লোড করতে চান। কারণ আগ্রহী লোডিংয়ের সাথে আপনি সংগ্রহে প্রতিটি মডেলের পরিবর্তে কেবলমাত্র একটি অতিরিক্ত ডিবি ক্যোয়ারী চালান।
উদাহরণ:
User > hasMany > Post
$users = User::with('posts')->get();
foreach($users as $user){
$users->posts; // posts is already loaded and no additional DB query is run
}
has()
সম্পর্কের ভিত্তিতে বাছাই করা মডেলটি ফিল্টার করা। সুতরাং এটি একটি সাধারণ WHOE অবস্থার সাথে খুব একইভাবে কাজ করে। যদি আপনি কেবল তার ব্যবহার করেন তবে আপনি কেবলমাত্র has('relation')
এই সম্পর্কের সাথে সম্পর্কিত মডেলগুলি পেতে চান।
উদাহরণ:
User > hasMany > Post
$users = User::has('posts')->get();
// only users that have at least one post are contained in the collection
whereHas()
মূলত একইরূপে কাজ করে has()
তবে আপনাকে পরীক্ষা করতে সংশ্লিষ্ট মডেলটির জন্য অতিরিক্ত ফিল্টার নির্দিষ্ট করার অনুমতি দেয়।
উদাহরণ:
User > hasMany > Post
$users = User::whereHas('posts', function($q){
$q->where('created_at', '>=', '2015-01-01 00:00:00');
})->get();
// only users that have posts from 2015 on forward are returned
whereHas
পোস্ট জিজ্ঞাসা করার সময় ব্যবহারকারীর সম্পর্কের উপর ব্যবহার করুন।
whereHas
এটি ব্যবহার করে use Illuminate\Database\Eloquent\Builder;
যা পরে সাথে আছেন function(Builder $query)
। বেশিরভাগ উদাহরণ যা আমি দেখেছি, বিন্দুটি ব্যবহার করে Builder
, $ কোয়েরিটি পাস করুন, কোনটি সঠিক?
দস্তাবেজ ইতিমধ্যে ব্যবহারের ব্যাখ্যা দিয়েছে। সুতরাং আমি এই পদ্ধতিগুলি ব্যাখ্যা করতে এসকিউএল ব্যবহার করছি
ধরে নিচ্ছি সেখানে Order (orders)
অনেক রয়েছে OrderItem (order_items)
।
এবং আপনি ইতিমধ্যে তাদের মধ্যে সম্পর্ক তৈরি করেছেন।
// App\Models\Order:
public function orderItems() {
return $this->hasMany('App\Models\OrderItem', 'order_id', 'id');
}
এই তিনটি পদ্ধতি সবই একটি সম্পর্কের উপর ভিত্তি করে ।
ফলাফল: with()
মডেল অবজেক্ট এবং এর সম্পর্কিত ফলাফলগুলি ফিরিয়ে দিন।
সুবিধা: এটি আগ্রহী-লোডিং যা এন + 1 সমস্যা রোধ করতে পারে ।
আপনি যখন নিম্নলিখিত বর্ণনাকারী নির্মাতা ব্যবহার করছেন:
Order::with('orderItems')->get();
লারাভেল এই কোডটি কেবল দুটি এসকিউএল- তে পরিবর্তন করুন :
// get all orders:
SELECT * FROM orders;
// get the order_items based on the orders' id above
SELECT * FROM order_items WHERE order_items.order_id IN (1,2,3,4...);
এবং তারপরে লারাভেল দ্বিতীয় এসকিউএলের ফলাফলগুলি বিদেশী কী দ্বারা প্রথম এসকিউএল এর ফলাফল থেকে আলাদা হিসাবে মার্জ করে । শেষ অবধি সংগ্রহের ফলাফল।
সুতরাং যদি আপনি বন্ধ হয়ে বিদেশী_কি ছাড়া কলামগুলি নির্বাচন করেন তবে সম্পর্কের ফলাফলটি খালি হবে:
Order::with(['orderItems' => function($query) {
// $query->sum('quantity');
$query->select('quantity'); // without `order_id`
}
])->get();
#=> result:
[{ id: 1,
code: '00001',
orderItems: [], // <== is empty
},{
id: 2,
code: '00002',
orderItems: [], // <== is empty
}...
}]
Has
মডেলটির বস্তুটি ফিরিয়ে দেবে যে এর সম্পর্ক খালি নয় ।
Order::has('orderItems')->get();
লারাভেল এই কোডটি একটি এসকিউএল এ পরিবর্তন করুন :
select * from `orders` where exists (
select * from `order_items` where `order`.`id` = `order_item`.`order_id`
)
whereHas
এবং আপনার প্রশ্নের উপর শর্ত স্থাপন orWhereHas
করার পদ্ধতি । এই পদ্ধতিগুলি আপনাকে সম্পর্কের সীমাবদ্ধতায় কাস্টমাইজড সীমাবদ্ধতা যুক্ত করতে দেয় ।where
has
Order::whereHas('orderItems', function($query) {
$query->where('status', 1);
})->get();
লারাভেল এই কোডটি একটি এসকিউএল এ পরিবর্তন করুন :
select * from `orders` where exists (
select *
from `order_items`
where `orders`.`id` = `order_items`.`order_id` and `status` = 1
)
with('relation')
ফিরে সংগ্রহে সংশ্লিষ্ট টেবিল ডেটা অন্তর্ভুক্ত করা হবে,has('relation')
এবংwhereHas('relation')
হবে না সংশ্লিষ্ট টেবিল ডেটা অন্তর্ভুক্ত। সুতরাং আপনারwith('relation')
পাশাপাশি পাশাপাশিhas()
বা উভয়কে কল করার প্রয়োজন হতে পারেwhereHas()
।