【问题标题】:Relationships of models (Laravel 5.2)模型的关系(Laravel 5.2)
【发布时间】:2016-06-12 21:44:03
【问题描述】:

我的表(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`))

添加。信息:

我的表已迁移。只是为了澄清......产品和优惠从项目表继承。如果未创建该项目,我将无法添加产品和优惠。

产品可以具有标题、摘要、内容、类别等...与优惠相同。

  • 该产品可以在 1 多家商店中销售
  • 该优惠仅适用于 1-1 商店。

如果我错了,请告诉我!

** 请,我希望有人帮助我创建项目模型、产品和报价之间的关系。我可以使用多态关系吗? **

模型完成:

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 tinker,一切正常!

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 表)。

谢谢。

【问题讨论】:

    标签: mysql laravel model-view-controller laravel-5 eloquent


    【解决方案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();
    });
    

    所以,一旦你这样做了,你就可以将你的关系放到你的模型上。这样你就不需要所有的“中间”表。当你使用 associate() 时,Laravel 会为你创建链接。这样你就可以这样做: $offer->store()->name 来获取当前offer的商店名称。看看:

    进入 Store 的模型

    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() 将检索商店的所有优惠。

    希望对您有所帮助。

    编辑

    我所说的只有一个问题。 n+1 问题。所以喜欢那里解释(搜索谷歌“laravel n + 1问题”并选择laracast的链接)(不能把它作为链接,没有足够的声誉),当你像我说的那样打电话时,脚本会做2询问。当您使用 foreach() 循环时,它将有尽可能多的循环 +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}
                            }}
    }
    

    【讨论】:

    • 我会给你更多细节...谢谢。
    • 我正在阅读有关 n + 1 问题的内容,并意识到我需要给您更多解释。我只是编辑我的帖子。
    • 谢谢埃利。如果有人有任何其他想法,请与我们分享!
    猜你喜欢
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2016-06-23
    • 1970-01-01
    • 2019-04-04
    相关资源
    最近更新 更多