【问题标题】:Laravel Eloquent Relationship Many to Many Naming ConventionLaravel Eloquent 关系多对多命名约定
【发布时间】:2016-09-21 01:15:29
【问题描述】:

我正在我的应用程序中创建一个购买的表。所以我有 2 个表:用户和产品。它是多对多的关系。

我知道我们必须为此创建一个新表。表的命名约定是用户和产品的复数。

我们如何称呼这个采购表? user_product 还是 users_products?

另外我认为我需要一个模型来解决这个问题吗?如果我确实需要一个模型,这个模型的命名约定应该是 User_Product 吗?

【问题讨论】:

    标签: laravel laravel-5.2


    【解决方案1】:

    关于命名约定,我认为这只是让你的代码更具可读性的东西,所以你可以随意命名(如果你是新手并且正在学习,我认为最好避免陷入约定起初,我还在学习我自己)

    无论如何都不需要枢轴模型,除非您只需要一些自定义行为

    我认为这会对你有所帮助

    class User extends Model
    {
        /**
         * The products that belong to the shop.
         */
        public function products()
        {
            return $this->belongsToMany('App\Products');
        }
    }
    

    您可以这样做:$user->products 或查询 $product->users,或两者兼而有之。

    现在,通过这种关系声明,Laravel “假定”数据透视表名称遵守规则并且是 user_product。但是,如果它实际上不同(例如,它是复数),您可以将其作为第二个参数提供:

    return $this->belongsToMany('App\Products', 'products_users');
    

    如果您想知道如何管理这些,可以在here 中找到更多信息

    【讨论】:

    • 这与这个问题并没有真正的关系,但是如果我们没有模型可以通过 eloquent 访问它,您将如何保存到 user_product 表?
    • 使用->attach()->detach() 方法例如$user->products()->attach($product); 和这怎么不相关?
    【解决方案2】:

    来自documentation

    如前所述,为了确定关系的连接表的表名,Eloquent 会按字母顺序连接两个相关的模型名。但是,您可以随意覆盖此约定。您可以通过将第二个参数传递给 belongsToMany 方法来做到这一点

    在您的情况下,Laravel 假设您的连接表将命名为 product_user。不需要额外的模型:

    用户.php

    class User extends Model
    {
        //...
        public function products()
        {
            return $this->belongsToMany(Product::class);
        }
        //...
    }
    

    Product.php

    class Product extends Model
    {
        //...
        public function users()
        {
            return $this->belongsToMany(User::class);
        }
        //...
    }
    

    你的架构看起来像这样:

    用户表迁移

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

    产品表迁移

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

    product_user 表迁移

    Schema::create('product_user', function (Blueprint $table) {
        $table->integer('product_id');
        $table->integer('user_id');
        //...
    });
    

    【讨论】:

      猜你喜欢
      • 2014-03-12
      • 1970-01-01
      • 2019-06-13
      • 1970-01-01
      • 2016-12-28
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 2013-02-09
      相关资源
      最近更新 更多