首页 文章

模型的关系(Laravel 5.2)

提问于
浏览
1

我的表(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 回答

  • 1

    这就是我认为你可以有一个好的开始......

    首先,您的模型和迁移可以处理所有这些问题 .

    有关系:Laravel 5.2 Relationship有迁移:Laravel 5.2 Migration

    那么您可以创建迁移:

    Schema::create('stores', function (Blueprint $table) {
        $table->bigIncrements('id')->unsigned();
        $table->string('name', 50);
        $table->timestamps();
    });
    
    Schema::create('items', function (Blueprint $table) {
        $table->bigIncrements('id')->unsigned();
        $table->bigInteger('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users');
        $table->text('title');
        $table->longText('content');
        $table->timestamps();
    });
    
    Schema::create('products', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->bigInteger('store_id')->unsigned();
        $table->foreign('store_id')->references('id')->on('stores');
        $table->decimal('reviews', 7,1);
        $table->timestamps();
    });
    
    Schema::create('offers', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->bigInteger('store_id')->unsigned();
        $table->foreign('store_id')->references('id')->on('stores');
        $table->bigInteger('item_id')->unsigned();
        $table->foreign('item_id')->references('id')->on('items');
        $table->decimal('price', 7,2);
        $table->string('url', 255);
        $table->dte('start_date');
        $table->dte('end_date');
        $table->timestamps();
    });
    

    所以,一旦你这样做,你就可以 Build 你的模型关系 . 这样您就不需要所有“之间”表 . 当您使用associate()时,Laravel将为您创建链接 . 通过这种方式,您可以执行以下操作:$ offer-> store() - > name以获取当前商品的商店名称 . 看一看:

    进入商店的模特

    public function products()
    {
        return $this->hasMany(Product::class);
    }
    
    public function offers()
    {
        return $this->hasMany(Offer::class);
    }
    

    进入Offer的模型

    public function store()
    {
        return $this->belongsTo(Store::class);
    }
    

    这样,您可以创建一对多关系 . 我说过,$ 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查询 . 我建议你做那样的事情

    $offers = Offer::with('store')->all();
    

    这样你只有1个查询,你仍然可以这样做

    $offer->store;
    

    不做另一个查询 .

    当你使用$ model = Model :: with('something') - > all();时,查询将从2表中获取数据并将带有数组的结果返回到数组中 . 像这样:

    offers {
        [0]:{a,b,c,d,e, store{a,b,c,d,e}}
        [1]:{a,b,c,d,e, store{a,b,c,d,e}}
        [2]:{a,b,c,d,e, store{a,b,c,d,e}}
        [3]:{a,b,c,d,e, store{a,b,c,d,e}}
    }
    

    你可以使用相反的方法:

    $stores = Store::with('offers')->all();
    

    所以你可以使用:

    $store->offers[i]->somthing;
    

    因为数组看起来像这样:

    stores {
        [0]:{a,b,c,d,e, offers{
                            [0]:{a,b,c,d,e}
                            [1]:{a,b,c,d,e}
                            [2]:{a,b,c,d,e}
                            [3]:{a,b,c,d,e}
                            }}
        [1]:{a,b,c,d,e, offers{
                            [0]:{a,b,c,d,e}
                            [1]:{a,b,c,d,e}
                            [2]:{a,b,c,d,e}
                            [3]:{a,b,c,d,e}
                            }}
        [2]:{a,b,c,d,e, offers{
                            [0]:{a,b,c,d,e}
                            [1]:{a,b,c,d,e}
                            [2]:{a,b,c,d,e}
                            [3]:{a,b,c,d,e}
                            }}
    }
    

相关问题