මොඩියුලය 5

Eloquent Relationships සහ දත්ත සම්බන්ධ කිරීම


1 Eloquent Relationships යනු මොනවාද?

Eloquent Relationships මගින් ඔබගේ දත්ත සමුදා වගු අතර ඇති සම්බන්ධතා Models තුළ functions ලෙස නිර්වචනය කිරීමට ඉඩ සලසයි. මෙමගින් ඔබට අදාළ දත්ත ඉතා පහසුවෙන් ලබාගත හැක.

උදාහරණයක් ලෙස, නිෂ්පාදනයක ප්‍රවර්ගයේ නම ලබාගැනීමට, SQL `JOIN` විධානයක් ලිවීම වෙනුවට, `$product->category->name` වැනි සරල syntax එකක් භාවිතා කළ හැක.

ප්‍රධාන සම්බන්ධතා වර්ග:
  • `hasOne`: එක්-පේළියකට-එක්-පේළියක් සම්බන්ධතාවය. (උදා: User කෙනෙකුට එක් Phone එකක් තිබීම).
  • `hasMany`: එක්-පේළියකට-පේළි-කිහිපයක් සම්බන්ධතාවය. (උදා: එක් Category එකකට Products කිහිපයක් තිබීම).
  • `belongsTo`: `hasMany` සම්බන්ධතාවයේ ප්‍රතිවිරුද්ධ පැත්ත. (උදා: එක් Product එකක් එක් Category එකකට අයත් වීම).
  • `belongsToMany`: පේළි-කිහිපයකට-පේළි-කිහිපයක් සම්බන්ධතාවය (Many-to-Many).
2 Models තුළ සම්බන්ධතා නිර්වචනය කිරීම

සම්බන්ධතා නිර්වචනය කරන්නේ අදාළ Model ගොනු තුළ, කිසිදු arguments නොගන්නා public function එකක් ලෙසය.

`Product` model (`app/Models/Product.php`):

සෑම නිෂ්පාදනයක්ම එක් ප්‍රවර්ගයකට **අයත් වේ** (`belongsTo`).

namespace App\Models; use Illuminate\Database\Eloquent\Model; class Product extends Model { // ... public function category() { return $this->belongsTo(Category::class); } }

`Category` model (`app/Models/Category.php`):

සෑම ප්‍රවර්ගයකටම නිෂ්පාදන **කිහිපයක් තිබිය හැක** (`hasMany`).

namespace App\Models; use Illuminate\Database\Eloquent\Model; class Category extends Model { // ... public function products() { return $this->hasMany(Product::class); } }

⭐ ප්‍රායෝගික පැවරුම: සම්බන්ධතා ගොඩනගා, ගතික ඩ්‍රොප්ඩවුන් මෙනුවක් සෑදීම

පියවර 1: Models තුළ Relationships නිර්වචනය කිරීම

ඉහත උදාහරණ වල පෙන්වා ඇති පරිදි, ඔබගේ `Product.php` සහ `Category.php` model ගොනු විවෘත කර, `category()` සහ `products()` යන relationship functions දෙක නිර්වචනය කරන්න. එලෙසම, `Sale` සහ `User` අතර ද (`Sale` `belongsTo` `User`) සම්බන්ධතාවයක් ගොඩනගන්න.

පියවර 2: Controller එකෙන් අදාළ දත්ත ලබාගැනීම (Eager Loading)

නිෂ්පාදන ලැයිස්තුව පෙන්වන විට, එක් එක් නිෂ්පාදනය සඳහා වෙන වෙනම category එක ලබාගැනීමට query කිරීම (N+1 ගැටළුව) වෙනුවට, `with()` method එක භාවිතයෙන් සියලුම නිෂ්පාදන සමඟම ඒවාට අදාළ ප්‍රවර්ග දත්ත ද එකම query එකකින් ලබාගත හැක. මෙය **Eager Loading** ලෙස හැඳින්වේ.

`ProductController` හි `index()` method එක මෙසේ වෙනස් කරන්න:

// In ProductController.php -> index() $products = Product::with('category')->latest()->get(); return view('products.index', compact('products'));

පියවර 3: View එකේ Relationship එක භාවිත කිරීම

`products/index.blade.php` ගොනුවේ, ප්‍රවර්ගය පෙන්වන කොටස මෙසේ වෙනස් කරන්න. දැන් අපට `$product->category` ලෙස අදාළ Category model එකටත්, `$product->category->name` ලෙස එහි නමටත් සෘජුවම පිවිසිය හැක.

<!-- In products/index.blade.php --> <td>{{ $product->category->name ?? 'N/A' }}</td>

පියවර 4: නිෂ්පාදන ෆෝරමයට ගතික ඩ්‍රොප්ඩවුන් මෙනුවක් සෑදීම

`ProductController` හි `create()` method එක තුළ, සියලුම ප්‍රවර්ග ලබාගෙන, එය `create` view එකට යවන්න.

// In ProductController.php -> create() $categories = Category::all(); return view('products.create', compact('categories'));

දැන් `products/create.blade.php` ගොනුවේ, ප්‍රවර්ග තෝරාගැනීමේ ඩ්‍රොප්ඩවුන් මෙනුව මෙලෙස සකසන්න:

<select name="category_id" class="form-control"> @foreach ($categories as $category) <option value="{{ $category->id }}">{{ $category->name }}</option> @endforeach </select>

මෙම පියවර `edit` view එක සඳහා ද සිදු කරන්න. දැන් ඔබට ප්‍රවර්ග කළමනාකරණ පිටුවෙන් නව ප්‍රවර්ග එකතු කළ විට, ඒවා ස්වයංක්‍රීයව නිෂ්පාදන ෆෝරමයේ දිස්වනු ඇත.

‹‹ පෙර මොඩියුලය (Module 4) ඊළඟ මොඩියුලය (Module 6) ››