雄辩的关系设置,两个外键到同一个表laravel 5.2

时间:2016-03-02 05:37:41

标签: php laravel-5.2

我遇到了大问题,我在我的项目中保持雄辩的关系设置,我有以下关系:

  1. 与用户表中存储的登录相关的用户信息。
  2. 存储在个人资料信息中的用户个人资料相关信息。
  3. 存储在地址表中的用户地址
  4. 配置存储在城市,州,国家等配置中的相关信息
  5. 努力

    这是迁移和模型及其关系:

    users migration table
    
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Database\Migrations\Migration;
    
    class CreateUsersTable extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('users', function (Blueprint $table) {
                $table->increments('id');
                $table->string('email')->unique();
                $table->string('password', 60);
                $table->rememberToken();
                $table->timestamps();
            });
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::drop('users');
        }
    }
    
    User Model
    
    namespace App;
    
    use Illuminate\Foundation\Auth\User as Authenticatable;
    
    class User extends Authenticatable
    {
        /**
         * The attributes that are mass assignable.
         *
         * @var array
         */
        protected $fillable = [
            'email', 'password',
        ];
    
        /**
         * The attributes excluded from the model's JSON form.
         *
         * @var array
         */
        protected $hidden = [
            'password', 'remember_token',
        ];
    
        public function profile()
        {
            return $this->hasOne('App\Profile','user_id');
        }
    }
    
    profile migration table
    
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Database\Migrations\Migration;
    
    class CreateProfilesTable extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('profiles', function (Blueprint $table) {
                $table->increments('profile_id');
                $table->integer('user_id')->unsigned();
                $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
                $table->string('lastname')->nullable();
                $table->string('firstname')->nullable();
                $table->string('gender')->nullable();
                $table->string('phonenumber', 20)->nullable();
                $table->timestamps();
            });
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::drop('profiles');
        }
    }
    
    Profile Model
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Profile extends Model
    {
         protected $fillable = [
            'firstname', 'lastname',
        ];
    
        public function user(){
            return $this->belongsTo('App\User');
        }
        public function address()
        {
            return $this->hasOne('App\Address','profile_id');
        }
    }
    
    Configuration migration table
    
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Database\Migrations\Migration;
    
    class CreateConfigurationsTable extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('configurations', function (Blueprint $table) {
                $table->increments('config_id');
                $table->string('configuration_name');
                $table->string('configuration_type');
                $table->string('parent_id');
                $table->timestamps();
            });
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::drop('configurations');
        }
    }
    
    Configuration Model
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Configuration extends Model
    {
        public function children() {
            return $this->hasMany('App\Configuration','parent_id');
        }
        public function parent() {
            return $this->belongsTo('App\Configuration','parent_id');
        }
    
        public function city() {
            return $this->hasOne('App\Address', 'city');
        }
    
        public function state() {
          return $this->hasOne('App\Address', 'state');
        }
    
        public function country() {
            return $this->hasOne('App\Address', 'country');
        }
    }
    
    Address Migration Table
    
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Database\Migrations\Migration;
    
    class CreateAddressesTable extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('addresses', function (Blueprint $table) {
                $table->increments('address_id');
                $table->integer('profile_id')->unsigned();
                $table->foreign('profile_id')->references('profile_id')->on('profiles')->onDelete('cascade');
                $table->string('address')->nullable();
                $table->integer('city')->unsigned();
                $table->foreign('city')->references('config_id')->on('configurations')->onDelete('cascade');
                $table->string('pincode')->nullable();
                $table->integer('state')->unsigned();
                $table->foreign('state')->references('config_id')->on('configurations')->onDelete('cascade');
                $table->integer('country')->unsigned();
                $table->foreign('country')->references('config_id')->on('configurations')->onDelete('cascade');
                $table->timestamps();
            });
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::drop('addresses');
        }
    }
    
    Address Model
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Address extends Model
    {
        public function profile(){
            return $this->belongsTo('App\Profile');
        }
    
        public function city() {
            return $this->belongsTo('App\Configuration');
        }
    
        public function state() {
          return $this->belongsTo('App\Configuration');
        }
    
        public function country() {
            return $this->belongsTo('App\Configuration');
        }
    }
    

    我使用Eloquent relation setup, two foreign keys to same table来建立我的项目关系。但不幸的是,上面的代码并没有产生欲望输出。看看:

    If i use below command:
    
    Auth::user()->profile->firstname
    
    it will print user first name
    
    So if i use 
    
    Auth::user()->profile->address->city
    it should print city name stored in configuration table, but instead print name it print the id.
    

    请建议我的解决方案。

    谢谢,

1 个答案:

答案 0 :(得分:7)

好吧,我为自己的问题找到了解决方案。感谢所有认为这个问题有价值的人。

好吧,我们不需要更改用户或个人资料,我们只需要对配置和地址模型进行一些更改。

更改

class Address extends Model
{
    public function profile(){
        return $this->belongsTo('App\Profile');
    }

    public function city() {
        return $this->belongsTo('App\Configuration');
    }

    public function state() {
      return $this->belongsTo('App\Configuration');
    }

    public function country() {
        return $this->belongsTo('App\Configuration');
    }
}

class Address extends Model
{
    public function profile(){
        return $this->belongsTo('App\Profile');
    }

    public function cityConfiguration() {
        return $this->belongsTo('App\Configuration', 'city');
    }

    public function stateConfiguration() {
      return $this->belongsTo('App\Configuration', 'state');
    }

    public function countryConfiguration() {
        return $this->belongsTo('App\Configuration', 'country');
    }
}

并更改

class Configuration extends Model
{
    public function children() {
        return $this->hasMany('App\Configuration','parent_id');
    }
    public function parent() {
        return $this->belongsTo('App\Configuration','parent_id');
    }

    public function city() {
        return $this->hasOne('App\Address', 'city');
    }

    public function state() {
      return $this->hasOne('App\Address', 'state');
    }

    public function country() {
        return $this->hasOne('App\Address', 'country');
    }
}

class Configuration extends Model
{
    public function children() {
        return $this->hasMany('App\Configuration','parent_id');
    }
    public function parent() {
        return $this->belongsTo('App\Configuration','parent_id');
    }

    public function city() {
        return $this->hasOne('App\Address', 'city');
    }

    public function state() {
      return $this->hasOne('App\Address', 'state');
    }

    public function country() {
        return $this->hasOne('App\Address', 'country');
    }
}

就是这样。一切都很好。