इस तरह से मुझे लगता है कि आप एक अच्छी शुरुआत कर सकते हैं...
सबसे पहले, आपका मॉडल और माइग्रेशन यह सब संभाल सकता है।
संबंध के लिए है:लारावेल 5.2 संबंध माइग्रेशन के लिए है:लारावेल 5.2 माइग्रेशन
तो वहां आप अपना माइग्रेशन बनाएं:
Schema::create('stores', function (Blueprint $table) {
$table->bigIncrements('id')->unsigned();
$table->string('name', 50);
$table->timestamps();
});
Schema::create('items', function (Blueprint $table) {
$table->bigIncrements('id')->unsigned();
$table->bigInteger('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
$table->text('title');
$table->longText('content');
$table->timestamps();
});
Schema::create('products', function (Blueprint $table) {
$table->bigIncrements('id');
$table->bigInteger('store_id')->unsigned();
$table->foreign('store_id')->references('id')->on('stores');
$table->decimal('reviews', 7,1);
$table->timestamps();
});
Schema::create('offers', function (Blueprint $table) {
$table->bigIncrements('id');
$table->bigInteger('store_id')->unsigned();
$table->foreign('store_id')->references('id')->on('stores');
$table->bigInteger('item_id')->unsigned();
$table->foreign('item_id')->references('id')->on('items');
$table->decimal('price', 7,2);
$table->string('url', 255);
$table->dte('start_date');
$table->dte('end_date');
$table->timestamps();
});
तो, एक बार ऐसा करने के बाद, आप अपने रिश्ते को अपने मॉडल पर बना सकते हैं। इस तरह आपको सभी "बीच" टेबल की आवश्यकता नहीं है। जब आप सहयोगी () का उपयोग करेंगे, तो लारवेल आपके लिए लिंक बनाएगा। इस तरह आप कुछ इस तरह कर सकते हैं:$offer->store()->name वर्तमान ऑफ़र के स्टोर का नाम प्राप्त करने के लिए। एक नज़र डालें:
स्टोर के मॉडल में
public function products()
{
return $this->hasMany(Product::class);
}
public function offers()
{
return $this->hasMany(Offer::class);
}
ऑफ़र के मॉडल में
public function store()
{
return $this->belongsTo(Store::class);
}
इस तरह, आप एक-से-अनेक संबंध बनाते हैं। क्या मैंने कहा है, $offer->store() ऑफर के स्टोर को पुनः प्राप्त करेगा। $store->offers()->get() स्टोर के सभी प्रस्तावों को पुनः प्राप्त करेगा।
आशा है कि यह मदद करेगा।
संपादित करें
मैंने जो कहा, उसमें एक ही समस्या है। n + 1 समस्या . तो जैसे यह वहां समझाता है (Google "लार्वेल एन + 1 समस्या" खोजें और लैराकास्ट के लिए लिंक चुनें) (इसे एक लिंक के रूप में नहीं रखा जा सकता है, पर्याप्त प्रतिष्ठा नहीं), जब आप चीजों को कॉल करते हैं जैसे मैंने कहा, स्क्रिप्ट 2 करेगी सवाल। जब आप foreach() लूप का उपयोग करते हैं, तो उसके पास उतनी ही लूप +1 क्वेरी होगी। मेरा सुझाव है कि आप इस तरह के काम करें
$offers = Offer::with('store')->all();
इस तरह आपके पास केवल 1 प्रश्न होगा और आप अभी भी कर पाएंगे
$offer->store;
एक और प्रश्न किए बिना।
जब आप $model =Model::with('something')->all(); का उपयोग करते हैं, तो क्वेरी 2 टेबल से डेटा प्राप्त करेगी और एक सरणी के साथ परिणाम को एक सरणी में वापस कर देगी। इस तरह:
offers {
[0]:{a,b,c,d,e, store{a,b,c,d,e}}
[1]:{a,b,c,d,e, store{a,b,c,d,e}}
[2]:{a,b,c,d,e, store{a,b,c,d,e}}
[3]:{a,b,c,d,e, store{a,b,c,d,e}}
}
आप इसके विपरीत उपयोग कर सकते हैं:
$stores = Store::with('offers')->all();
तो आप इसका उपयोग कर सकते हैं:
$store->offers[i]->somthing;
क्योंकि ऐरे इस तरह दिखेगा:
stores {
[0]:{a,b,c,d,e, offers{
[0]:{a,b,c,d,e}
[1]:{a,b,c,d,e}
[2]:{a,b,c,d,e}
[3]:{a,b,c,d,e}
}}
[1]:{a,b,c,d,e, offers{
[0]:{a,b,c,d,e}
[1]:{a,b,c,d,e}
[2]:{a,b,c,d,e}
[3]:{a,b,c,d,e}
}}
[2]:{a,b,c,d,e, offers{
[0]:{a,b,c,d,e}
[1]:{a,b,c,d,e}
[2]:{a,b,c,d,e}
[3]:{a,b,c,d,e}
}}
}