2016-07-20 4 views
0

Если я не прав, пожалуйста, поправьте меня.Когда использовать принадлежитTo и когда hasMany?

Есть таблица products и categories.

Каждый товар имеет собственную категорию. Таким образом, это может быть больше того.

Итак, нет, мне нужно выбрать все продукты указанной категории.

Какое отношение я должен использовать в модели: belongsTo, или hasMany? Важная последовательность?

+0

Извините за мое замешательство ... но может ли продукт иметь несколько категорий (или только один)? – Sam

+0

Продукт имеет несколько категорий – Dev

ответ

2

Так как products иметь несколько categories и categories может иметь несколько products, это известно как many-to-many SQL relationship.

Если мы перейдем к Laravel Eloquent documentation, вы увидите, что хотите использовать belongsToMany(). Это означает, что если вы хотите, чтобы иметь возможность получить все ваши products от category, вы могли бы сделать что-то вроде этого (беззастенчиво скопирована из документации Laravel в):

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Category extends Model 
{ 
    /** 
    * The products that belong to the category. 
    */ 
    public function products() 
    { 
     return $this->belongsToMany('App\Product'); 
    } 
} 

И, конечно, другая сторона этого многие -в-многих очень похоже:

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Product extends Model 
{ 
    /** 
    * The categories that belong to the product. 
    */ 
    public function categories() 
    { 
     return $this->belongsToMany('App\Category'); 
    } 
} 

Теперь ... если вы хотите, чтобы извлечь все продукты, а затем найти все категории для каждого продукта, вы могли бы сделать что-то вроде этого:

$products = Product::all(); 
foreach($products as $product) { 
    // var_dump($product); 

    $categories = $product->categories(); 
    foreach($categories as $category) { 
     // var_dump($category); 
    } 
} 
+0

Итак, я получаю все продукты по категориям, может быть метод 'products()' должен находиться в 'Product model'? – Dev

+0

В модели 'Product' у меня был бы похожий метод' categories() '. Это связано с тем, что если у вас есть объект '$ category', вы хотели бы получить от него продукты. В этом случае вы сможете сказать '$ category-> products()', и он будет извлекать все продукты из этих отношений «многие-ко-многим». Если вы сделаете обратное это на модели «Продукт», вы можете «$ product-> categories()» получить категории продукта. – Sam

+0

Хорошо, тогда как это назвать? Например: 'Product :: all() -> products();' – Dev