与数据透视表Laravel有关的错误

时间:2019-02-25 20:59:52

标签: php mysql laravel many-to-many relational-database

我需要在用户表和订阅表之间建立关系。 注册的用户将获得默认的免费用户,并看到1个要约。 如果看到白银有8个报价,那么黄金有15个,铂金有20个。 我使用数据透视表subscription_user在用户表和订阅表之间建立了关系。 第一个问题是我是否在模型关联方面犯了错误? 第二个问题是如何默认情况下仅返回一个报价,或者您是否订阅8个报价(银色),15(黄金),20(铂金)以及使用哪个控制器?

用户表:

Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('email')->unique();
    $table->timestamp('email_verified_at')->nullable();
    $table->string('password');
    $table->string('subscription')->default('free');
    $table->rememberToken();
    $table->timestamps();
});

订阅表:

   Schema::create('subscriptions', function (Blueprint $table) {
        $table->increments('id');
        $table->string('subscription');
        $table->integer('offers');
        $table->timestamps();
    });

Sabscription_user表:

 Schema::create('subscription_users', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('user_id')->unsigned()->index(); //user table
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); //foreign key relation
        $table->integer('subscription_id')->unsigned()->index();
        $table->foreign('subscription_id')->references('id')->on('subscriptions')->onDelete('cascade'); //foreign key relation
    });

订阅模式:

class Subscription extends Model
{
    public function users() {
        return $this->belongsToMany('App\User');
    }
}

用户模型:

public function subscriptions(){
    return $this->belongsToMany('App\Subscription');
}

对于多对多关系而言,一切是否都应连接? 我可以在哪个控制器中获取有关报价的信息?

1 个答案:

答案 0 :(得分:2)

按照惯例,数据透视表被命名为单数,因此您需要通过添加第二个参数来指定。我喜欢包含所有参数,因此无论如何都不要猜测。

public function subscriptions()
{
    return $this->belongsToMany("App\Subscription", 'subscription_users', 'user_id', 'subscription_id', 'id',  'id');

}

public function users()
{
    return $this->belongsToMany("App\User", 'subscription_users', 'subscription_id', 'user_id', 'id',  'id');

}

是的,您应该使用控制器,但这取决于您试图显示它的位置。我想您将需要在某处显示当前订阅以及添加和删除。