Laravel Eloquent Relationship of Many to Many Naming Convention

时间:2016-05-24 01:50:42

标签: laravel laravel-5.2

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

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

我们如何称这个购买表? user_product或users_products?

另外我想我需要一个这样正确的模型?如果我确实需要一个模型,该模型的命名约定应该是User_Product吗?

2 个答案:

答案 0 :(得分:2)

来自documentation

  

如前所述,要确定关系连接表的表名,Eloquent将按字母顺序连接两个相关的模型名称。但是,您可以自由地覆盖此约定。您可以通过将第二个参数传递给belongsToMany方法

来实现

在您的情况下,Laravel假定您的加入表名为product_user。不需要额外的模型:

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');
    //...
});

答案 1 :(得分: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

中找到更多内容