2014-09-16 6 views
1

Мне нужно реализовать модель для таблицы с двумя внешними ключами. В моем db у меня есть таблицы вроде этого:Laravel - модель для таблицы с только внешними ключами (сводная таблица)

product (id_product, ...) 
category_to_product (FK id_category, FK id_product) 
category (id_category, ...) 

Как управлять этими соединениями в Ларавеле? Должен ли я реализовывать модель для таблицы слияния и как она выглядит? Таблица category_to_product не представляет собой сущность (/ model) и обладает только свойством конструктивного отношения.

database-model


База данных Миграции

CategoryToProduct

Schema::create('category_to_product', function(Blueprint $table) 
{ 
    $table->integer('id_category')->unsigned(); 
    $table->foreign('id_category') 
      ->references('id_category') 
      ->on('categories') 
      ->onDelete('cascade'); 
    $table->integer('id_product')->unsigned(); 
    $table->foreign('id_product') 
      ->references('id_product') 
      ->on('products') 
      ->onDelete('cascade'); 
}); 

Продукты

Schema::create('products', function(Blueprint $table) 
{ 
    $table->increments('id_product'); 
    // ... 
}); 

Категории

Schema::create('categories', function(Blueprint $table) 
{ 
    $table->increments('id_category'); 
    // ... 
}); 
+0

возможно дубликат [Laravel 4 красноречивой сводная таблица] (HTTP: // StackOverflow .com/вопросы/16550761/laravel-4-eloquent-pivot-table) – Mysteryos

ответ

1

Выполните следующие действия:

В модели Категория:

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

В модели продукта:

public function categories(){ 
    return $this->belongsToMany('Category', 'category_to_product'); 
} 

В модели CategoryToProduct:

public function categories() { 
    return $this->belongsTo('Category'); 
} 

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

Примечание называние этих методов! Те же, что и имена DB-таблицы. См. ChainList's ответ.

+0

Привет, спасибо за ваш ответ. В вашем примере вы используете 'attribToMany', но в других примерах люди использовали этот метод с методом' withPivot'. При необходимости метод 'withPivot'? – Sonique

+0

@Sonique См. Здесь: http://laravel.com/docs/eloquent#working-with-pivot-tables –

+2

withPivot необходим, когда вы хотите вручную получать информацию из сводной таблицы. (Например, вы можете иметь сводную таблицу с двумя внешними ключами, а также третьи столбцы, называемые «retweet».Без вызова метода withPivot вы не можете получить доступ к столбцам «retweet». Для этого просто выполните следующие действия: Category :: where ('id', 1) -> withPivot() -> first() -> retweet – ChainList

2

@ pc-shooter прав насчет создания методов.

Но вы все равно должны создать сводную таблицу с миграцией первой

Schema::create('products', function(Blueprint $table) 
{ 
    $table->increments('id') 
    $table->string('name'); 
} 
Schema::create('categories', function(Blueprint $table) 
{ 
    $table->increments('id') 
    $table->string('name'); 
} 

Тогда ваша сводной таблица

Schema::create('category_product', function(Blueprint $table) 
{ 
    $table->integer('category_id') 
    $table->foreign('category_id')->references('id')->on('categories'); 

    $table->integer('product_id'); 
    $table->foreign('product_id')->references('id')->on('products'); 

    // And finally, the indexes (Better perfs when fetching data on that pivot table) 
    $table->index(['category_id', 'product_id'])->unique(); // This index has to be unique 
} 
+0

Привет, я уже создал сводную таблицу и другие. Но я также добавил 'unsigned', потому что' autoincrement' в laravel и mysql делает поле unsigned и 'cascade delete', потому что без строки продукта или категории бессмысленно. Также добавлен код на вопрос. '$ table-> integer ('id_category') -> unsigned(); $ Table-> иностранный ('id_category') -> ссылки ('id_category') -> по ('категорий') -> OnDelete ('каскадных'); ' – Sonique

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