2016-11-18 3 views
0

У меня есть таблица с продуктами, одна с категориями и одна, связывающая продукты с несколькими категориями. Все с правильными внешними ключами, связывающими их вместе. Когда пользователь находится в категории, продукты в этой категории выбираются с использованием модели ProductToCategory.OrderBy со связанными таблицами базы данных в Laravel 5.1

Но я хотел бы найти простой способ, не зацикливая на выходе связанных продуктов в эту категорию для сортировки продуктов по названию.

Мой формат базы данных:

products 
    id: 1; name: testing 123 
    id: 2; name: testing 345 
    id: 3; name: testing 567 

product_categories 
    id: 1; name: cat one 
    id: 2; name: cat two 
    id: 3; name: cat three 

product_to_categories 
    id: 1; product_id: 1; product_category_id: 1 
    id: 2; product_id: 1; product_category_id: 2 
    id: 3; product_id: 2; product_category_id: 1 
    id: 4; product_id: 3; product_category_id: 1 
    id: 5; product_id: 3; product_category_id: 2 
    id: 6; product_id: 3; product_category_id: 3 

В моей ProductCategory модели у меня есть:

public function ProductToCategory() { 
    return $this->hasMany('App\Models\ProductToCategory'); 
} 

В моей ProductToCategory модели у меня есть:

public function Product() { 
    return $this->belongsTo('App\Models\Product', 'product_id'); 
} 

В контроллере у меня есть:

$linked_products = $category->ProductToCategory()->get(); 
foreach($linked_products as $linked_product) { 
    if($linked_product->Product->is_active == 1) { 
     $array[$linked_product->product_id] = $linked_product->Product); 
    } 

} 

Это дает мне $linked_product->Product информацию о товаре Мне нужно.

Но используя подход «Яркий» в моделях, я хочу заказать продукцию по имени, прежде чем дать мне результат запроса.

Как это сделать?

+0

Что такое ProductToCategory? Почему бы вам не использовать многие-ко-многим с ownToMany? – sleepless

+0

ProductToCategory - это таблица, в которой один продукт может быть связан с несколькими категориями. Таким образом, у вас есть, например, product_id 1 в базе данных как 'product_id 1; category_id 1; 'и' product_id 1; category_id 2; '. Поэтому я делаю запрос с category_id, чтобы получить все продукты этой категории. Было бы проще, если бы каждый продукт был связан с одной категорией –

ответ

1

Кажется, что у вас есть many-to-many relation. Вам не нужна модель ProductToCategory.

Вместо этого вам нужно это соотношение в вашей ProductCategory-Model:

public function products() 
{ 
    return $this->belongsToMany('App\Models\Product'); 
} 

И в вашем продукте-Model:

public function categories() 
{ 
    return $this->belongsToMany('App\Models\ProductCategory'); 
} 

Вы также можете указать имя сводной таблицы (product_to_category-table) и названия колонок:

public function categories() 
{ 
    $this->belongsToMany('App\Models\ProductCategory', 'table_name', 'product_id ', 'product_category_id '); 
} 

С этим вы можете запросить его s следует:

$linked_products = $category->products()->orderBy('name')->get(); 
+0

Но где отмечено, что идентификатор продукта 1 относится к категории id 1 и категории id 2? –

+0

@AlvinBakker Взгляните на мой обновленный ответ. Laravel угадывает имена, основанные на вашей модели. Но вы можете указать их явно, если столбцы или таблица названы по-разному. – sleepless

+0

Я адаптировал вопрос с макетом базы данных, чтобы показать вам, что я имею в виду, почему мне нужна таблица «product_to_categories», так как один продукт может быть в трех категориях. Ваш адаптированный ответ состоит в том, что категории и продукты связаны друг с другом, и только именование отличается. Но это не так, поскольку между ними есть одно. Надеюсь, что добавление макета базы данных в мой вопрос сделает это более ясным. –

Смежные вопросы