我的表(Mysql DB):
//商店表
CREATE TABLE IF NOT EXISTS `app_beta`.`stores` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`))
//项目表
CREATE TABLE IF NOT EXISTS `app_beta`.`items` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` INT UNSIGNED NOT NULL,
`title` TEXT NOT NULL,
`content` LONGTEXT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_items_user_id`
FOREIGN KEY (`user_id`)
REFERENCES `app_beta`.`users` (`id`))
//产品表
CREATE TABLE IF NOT EXISTS `app_beta`.`products` (
`id` INT UNSIGNED NOT NULL,
`reviews` DECIMAL(7,1) NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_products_id`
FOREIGN KEY (`id`)
REFERENCES `app_beta`.`items` (`id`))
// Product_Store表
CREATE TABLE IF NOT EXISTS `app_beta`.`products_stores` (
`product_id` INT UNSIGNED NOT NULL,
`store_id` INT UNSIGNED NOT NULL,
`price` DECIMAL(7,2) NOT NULL,
`url` VARCHAR(255) NOT NULL,
CONSTRAINT `fk_products_store_product_id`
FOREIGN KEY (`product_id`)
REFERENCES `app_beta`.`products` (`id`),
CONSTRAINT `fk_products_stores_store_id`
FOREIGN KEY (`store_id`)
REFERENCES `app_beta`.`stores` (`id`))
//优惠表
CREATE TABLE IF NOT EXISTS `app_beta`.`offers` (
`id` INT UNSIGNED NOT NULL,
`store_id` INT UNSIGNED NOT NULL,
`price` DECIMAL(7,2) NULL,
`url` VARCHAR(255) NOT NULL,
`start_date` DATE NOT NULL,
`end_date` DATE NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_offers_store_id`
FOREIGN KEY (`store_id`)
REFERENCES `app_beta`.`stores` (`id`),
CONSTRAINT `fk_offers_id`
FOREIGN KEY (`id`)
REFERENCES `app_beta`.`items` (`id`))
Add. Info:
我的表已迁移 . 只是为了澄清......产品和产品继承自items表 . 如果未创建该项目,则无法添加产品和优惠 .
该产品可以具有 Headers ,摘要,内容,类别等......与报价相同 .
-
该产品可以在一个多商店
-
优惠仅适用于1-1店铺 .
如果我错了就知道了!
**请,我希望有人帮我创建Item模型,产品和商品之间的关系 . 我可以使用多态关系吗? **
模型完成:
class Store extends Model
{
public function offers()
{
return $this->hasMany('App\Offer');
}
public function products()
{
return $this->hasMany('App\Product');
}
}
class Product extends Model
{
public function stores()
{
return $this->belongsToMany('App\Store');
}
}
class Offer extends Model
{
public function store()
{
return $this->belongsTo('App\Offer');
}
}
使用php artisan修补匠,一切都很好!
namespace App
$user = new User
$store = new Store
$item = new Item
$item->id = 1
$item->user_id = 1
$item->title = 'test'
$item->content 'test'
$item->save();
true
$item2 = new Item
$item2->id = 2
....
true
$product1 = new Product
$product1->id = 1 (FK item->id)
$product1->reviews = 5
$product1->save()
true
$offer1 = new Offer
$offer1->id = 2 (FK item->id)
$offer1->store_id = 1
...
true
我稍后会添加一个函数来将产品附加到一个或多个商店(products_stores表) .
谢谢 .
1 回答
这就是我认为你可以有一个好的开始......
首先,您的模型和迁移可以处理所有这些问题 .
有关系:Laravel 5.2 Relationship有迁移:Laravel 5.2 Migration
那么您可以创建迁移:
所以,一旦你这样做,你就可以 Build 你的模型关系 . 这样您就不需要所有“之间”表 . 当您使用associate()时,Laravel将为您创建链接 . 通过这种方式,您可以执行以下操作:$ offer-> store() - > name以获取当前商品的商店名称 . 看一看:
进入商店的模特
进入Offer的模型
这样,您可以创建一对多关系 . 我说过,$ offer-> store()将检索商品的商品 . $ store-> offers() - > get()将检索商店的所有商品 .
希望它有所帮助 .
EDIT
我所说的只有一个问题 . n + 1 problem . 所以就像在那里解释一样(搜索谷歌"laravel n+1 problem"并选择链接到laracast)(可以't put it as a link, not enough reputation) , when you call things like I said, the script will do 2 query. When you use a foreach() loop, it' ll有尽可能多的循环1查询 . 我建议你做那样的事情
这样你只有1个查询,你仍然可以这样做
不做另一个查询 .
当你使用$ model = Model :: with('something') - > all();时,查询将从2表中获取数据并将带有数组的结果返回到数组中 . 像这样:
你可以使用相反的方法:
所以你可以使用:
因为数组看起来像这样: