【问题标题】:Relationship between Users, Settings, Setting_types Eloquent Laravel 5.4*用户、设置、设置类型之间的关系 Eloquent Laravel 5.4*
【发布时间】:2017-12-27 16:34:07
【问题描述】:

您将如何在下表之间创建关系:

用户表:

    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('firstname');
        $table->string('surename');
        $table->string('address')->nullable();
        $table->string('city')->nullable();
        $table->string('country')->nullable();
        $table->string('postcode')->nullable();
        $table->string('email')->unique();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });

设置类型表:

    Schema::create('setting_types', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->timestamps();
    });

设置表:

    Schema::create('settings', function (Blueprint $table) {
        $table->increments('id');
        $table->string('value');
        $table->timestamps();
    });

setting_type_user 表:

    Schema::create('setting_type_user', function (Blueprint $table) {
        $table->integer('user_id')->unsigned();
        $table->integer('type_id')->unsigned();
        $table->integer('setting_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users');
        $table->foreign('type_id')->references('id')->on('setting_types');
         $table->foreign('setting_id')->references('id')->on('settings');
        $table->timestamps();
    });

这是我想要得到的结果:

{"id":1,"value":"578943205.jpg","created_at":"2017-07-18 00:00:00","updated_at":null,"pivot":{"setting_id":1,"user_id":1,"type_id":1}}

【问题讨论】:

    标签: laravel eloquent relationship


    【解决方案1】:

    这取决于很多事情,但看起来你想在这里使用many-to-many 关系。

    首先,在settings pibot 表中将其更改为:

    $table->unsignedInteger('user_id');
    $table->unsignedInteger('type_id');
    

    foreign key constraints 添加到表中也是一个好主意:

    $table->foreign('user_id')->references('id')->on('users');
    $table->foreign('type_id')->references('id')->on('setting_types');
    

    然后在UserSettingType 模型中定义belongsToMany() 关系。由于您不遵循命名约定,因此您必须手动定义外键。在User 模型中:

    public function settingTypes()
    {
        return $this->belongsToMany('App\SettingType', 'settings', 'user_id', 'type_id');
    }
    

    SettingType 模型中:

    public function users()
    {
        return $this->belongsToMany('App\User', 'settings', 'type_id', 'user_id');
    }
    

    【讨论】:

    • SQLSTATE[42000]: 语法错误或访问冲突: 1066 不是唯一的表/别名: 'settings' (SQL: select settings.*, settings.user_id as pivot_user_id , settings.id as pivot_id from settings inner join settings on settings.id = settings.id 其中settings.@98为空,settings.@98 @ = 1 限制 1)
    • @Marco 如果你想帮助解决这个问题,你应该在收到错误时发布你正在执行的代码。
    • 我所做的一切都和你发布的例子一样。出于测试目的,我创建了一个方法设置: public function setting(){ $user = Auth::user(); return $user->settingTypes()->where('id',1)->first();}
    • 出于某种原因,Auth::user()null。我想你应该从解决这个问题开始。对于测试,您可以改用 $user = User::find(1);
    • 我确实使用 Auth::user() 获取了用户对象。您可以从查询中看到完全错误的。关系一定有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 2022-06-10
    • 2014-08-23
    • 2012-09-27
    • 1970-01-01
    • 2017-08-22
    相关资源
    最近更新 更多