如何管理模型的关系(fk)?

How to manage relationships(fk) of models?

我知道如何创建模型 - php artisan make:model nameofmodel,我知道在模型迁移中我必须声明 table 将具有哪些列:

class CreateNameofmodelTable extends Migration {

     /**
     * Run the migrations.
     *
     * @return void
     */
     public function up()
     {
        Schema::create('nameofmodels', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('name')->unique();
            $table->string('description');
            $table->timestamps();
        });
    }

   /**
   * Reverse the migrations.
   *
   * @return void
   */
   public function down()
   {
       Schema::drop('nameofmodels');
   }
}

但是如果我想使用 FK 关联两个模型,我必须在迁移文件或模型文件中设置哪些配置?

假设您有另一个具有 table 名称 users 的模型用户。您可以在 addressesusers 之间定义如下关系,

public function up()
    {
        Schema::create('addresses', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('add1');
            $table->string('add2');
            $table->string('city');
            $table->string('contact_no');
            $table->enum('is_primary',['yes','no'])->default('no');
            $table->integer('user_id')->unsigned();
            $table->timestamps();

            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        });
    }

在用户模型中 class,

class User extends Model {
   /**
   * The table associated with the model.
   *
   * @var string
   */
    protected $table = 'users';

    public function addresses()
    {
        return $this->hasMany('App\Address');
    }

}

在地址 class

class Address extends Model {
    /**
    * The table associated with the model.
    *
    * @var string
    */
   protected $table = 'addresses';

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

}

有关创建 table 的更多详细信息,请参见官方 Schema Docs on Laravel. And More information about Relation ship here

更新

根据 问题,在引用 table 之前,您必须先创建引用 table。在我们的例子中,users 必须在您 运行 迁移之前存在以创建 addresses table。

简单用例

假设,在控制器中你想知道特定用户有多少个地址,你可以像下面那样做,

$addressCount = User::find($userId)->addresses->count();

请注意 User::find($userId)->addresses returns 相关模型集合,而 User::find($userId)->addresses() returns 对象类型 HasMany

你也可以像下面这样遍历集合,

foreach(User::find($userId)->addresses as $address)
{
    echo '<pre>';
    print_r($address);
}

另一方面,您可以获得与特定地址关联的用户,如下所示,

$user = Address:find($addressId)->user; //returns object of type `User`
echo $user->first_name;

以下将工作

$user = Address:find($addressId)->user(); //returns object of type `belongsTo`
echo $user->first_name;

注意,以上 Address:find($addressId)->user 不会 return 集合,而是 class 用户的单个对象。这是因为 belongsTo 关系。

希望我已经为您说清楚了。但是没有官方的好docs.

Laracast 视频更适合 Laravel。

你可以这样使用...

class CreateNameofmodelTable extends Migration {

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('nameofmodels', function(Blueprint $table)
    {
        $table->increments('id');
        $table->string('name')->unique();
        $table->string('description');
        $table->timestamps();
    });
Schema::create('your table name', function(Blueprint $table) {
  $table->foreign('user_id')->references('id')->on('nameofmodels');
}

}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::drop('nameofmodels');
}

}

检查它..可能它工作正常....