2013-04-04 2 views
4

Я пытаюсь изучить Laravel и сейчас я экспериментирую с Eloquent. У меня есть следующий случай, который я не могу решить прямо сейчас:Laravel Eloquent Многие для многих, как

Скажем, я создаю интернет-магазин, так что у меня есть продукты (продукт 1, 2 продукта и т.д.):

+-------------+------------------+------+-----+---------------------+----------------+ 
| Field  | Type    | Null | Key | Default    | Extra   | 
+-------------+------------------+------+-----+---------------------+----------------+ 
| id   | int(10) unsigned | NO | PRI | NULL    | auto_increment | 
| name  | varchar(255)  | NO |  | NULL    |    | 
| slug  | varchar(255)  | NO |  | NULL    |    | 
| description | text    | NO |  | NULL    |    | 
| price  | decimal(5,2)  | NO |  | NULL    |    | 
| active  | tinyint(4)  | NO |  | 1     |    | 
| created_at | timestamp  | NO |  | 0000-00-00 00:00:00 |    | 
| updated_at | timestamp  | NO |  | 0000-00-00 00:00:00 |    | 
+-------------+------------------+------+-----+---------------------+----------------+ 

Эти продукты сортируются в Taxonomies (марка, цвет, отдел):

+-------------+------------------+------+-----+---------------------+----------------+ 
| Field  | Type    | Null | Key | Default    | Extra   | 
+-------------+------------------+------+-----+---------------------+----------------+ 
| id   | int(10) unsigned | NO | PRI | NULL    | auto_increment | 
| name  | varchar(255)  | NO |  | NULL    |    | 
| slug  | varchar(255)  | NO |  | NULL    |    | 
| description | text    | NO |  | NULL    |    | 
| created_at | timestamp  | NO |  | 0000-00-00 00:00:00 |    | 
| updated_at | timestamp  | NO |  | 0000-00-00 00:00:00 |    | 
+-------------+------------------+------+-----+---------------------+----------------+ 

Эти классификационная термины (Nike, Adidas, красный, зеленый, мальчики, девочки):

+-------------+------------------+------+-----+---------------------+----------------+ 
| Field  | Type    | Null | Key | Default    | Extra   | 
+-------------+------------------+------+-----+---------------------+----------------+ 
| id   | int(10) unsigned | NO | PRI | NULL    | auto_increment | 
| taxonomy_id | int(11)   | NO |  | NULL    |    | 
| name  | varchar(255)  | NO |  | NULL    |    | 
| slug  | varchar(255)  | NO |  | NULL    |    | 
| description | text    | NO |  | NULL    |    | 
| created_at | timestamp  | NO |  | 0000-00-00 00:00:00 |    | 
| updated_at | timestamp  | NO |  | 0000-00-00 00:00:00 |    | 
+-------------+------------------+------+-----+---------------------+----------------+ 

И последнее, что я быть_наст сводная таблица для подключения условия к продукции:

+------------+------------------+------+-----+---------------------+----------------+ 
| Field  | Type    | Null | Key | Default    | Extra   | 
+------------+------------------+------+-----+---------------------+----------------+ 
| id   | int(10) unsigned | NO | PRI | NULL    | auto_increment | 
| product_id | int(11)   | NO |  | NULL    |    | 
| term_id | int(11)   | NO |  | NULL    |    | 
| created_at | timestamp  | NO |  | 0000-00-00 00:00:00 |    | 
| updated_at | timestamp  | NO |  | 0000-00-00 00:00:00 |    | 
+------------+------------------+------+-----+---------------------+----------------+ 

я создал модели для продукта, систематики и Term, как это:

<?php 

class Product extends Eloquent { 

    public function terms() 
    { 
     return $this->belongsToMany('Term', 'product_terms', 'product_id', 'term_id'); 
    } 

} 

<?php 

class Taxonomy extends Eloquent { 

    public function terms() 
    { 
     return $this->hasMany('Term'); 
    } 

} 

<?php 

class Term extends Eloquent { 

    public function taxonomy() 
    { 
     return $this->belongsTo('Taxonomy'); 
    } 

} 

Теперь я хочу сделайте следующее: я хочу получить все продукты, перебрать их и показать что-то вроде имени, описания и цены. Ну, просто $products = Product::all(); - это все, что мне нужно. Затем, когда я перебираю продукты, я знаю, что могу сделать что-то вроде $product->terms, чтобы получить все условия. Но как получить термин данной таксономии. Так например, например:

<?php 
echo $product->term('brand'); // Where 'brand' is the taxonomy name of the term I want to get 
echo $product->term('color'); // Where 'color' is the taxonomy name of the term I want to get 

Надеюсь, кто-то может мне помочь.

ответ

3

Хорошо, я думаю Я понимаю вашу установку. Учитывая отношения вы заявили, я думаю, вы бы определить свои модели следующим образом:

<?php 

class Product extends Eloquent { 

    public function terms() 
    { 
     return $this->belongsToMany('Term')->withTimestamps(); 
    } 

} 

<?php 

class Taxonomy extends Eloquent { 

    public function terms() 
    { 
     return $this->hasMany('Term'); 
    } 

} 

<?php 

class Term extends Eloquent { 

    public function taxonomy() 
    { 
     return $this->belongsTo('Taxonomy'); 
    } 

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

} 

Поскольку ваш стержень назван и опознал правильно, вы не должны указывать эту информацию в отношениях belongsToMany, но если вы хотите, чтобы временные метки работали, вам нужно использовать timestamps.

EDIT:

Если вы можете посмотреть таксономии вверх по идентификатору вместо слизняка, это будет работать:

$products = Product::all(); 
foreach($products as $product) 
{ 
    $term = $product->terms()->with('taxonomy')->where('taxonomy_id', '=', 2)->first(); 
    echo $term->name; 
} 

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

$products = Product::all(); 
foreach($products as $product) 
{ 
    $terms = $product->terms()->with('taxonomy')->get(); 
    foreach($terms as $term) 
    { 
     if($term->taxonomy->slug == 'brand') 
     { 
      echo $term->name."<br />"; 
     } 
    } 
} 

END EDIT

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

<?php 
$product->taxonomy()->where('slug', '=', 'brand')->term; 
+0

Спасибо за ответ, я посмотрю на него позже сегодня. Но просто быстро понять, почему у меня есть термины, связанные с продуктами. Таксономия - это всего лишь название набора терминов. у вас есть такие термины, как «Красный, синий, зеленый, желтый», а таксономия этих терминов - «Цвет». Для продукта я хочу получить «условия», которые он имеет. Это не таксономии. Потому что, как правило, продукт будет иметь все таксономии. Меня интересуют, какие условия данной таксономии у него есть. «Какой цвет является продуктом», «Какой бренд является продуктом» – Crinsane

+0

Ow, и btw, последние две таблицы, где действительно то же самое, но это была ошибка. Обновите его сразу. – Crinsane

+0

Я не могу заставить это работать. Получите эту ошибку: 'Призыв к неопределенному методу Illuminate \ Database \ Query \ Builder :: taxonomy()' – Crinsane

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