個人的に頭にまとまったので忘備記録として、
migration側
$table->foreignId()の中に普通は'親テーブル名_id'として外部キー設定をすると、'親テーブル名_id'が子のcolumnとして認識されると同時に、親と子で親テーブルIDと'親テーブル名_id'のcolumnが自動的に紐づくため、楽ちん。
テーブルが自動的に認識され、user_id = 親のID が自動で認識されるパターン
$table->foreignId('user_id')->constrained();
がしかし、foreignId('user1')などcolumnを好きな名前にしたい!とすると上記のルールは通用しなくなり、laravel上でどのテーブルと接続するのかわからなくなる。そこで任意のcolumn名を付ける場合は、constrained()の引数の中に親のテーブル名を入力してlaravel側に認識させる必要がある。
$table->foreignId('user1')->constrained('users');
$table->foreignId('子のcolumn名として付けたい名前')->constrained('親テーブル名');
model側
上記コードで親テーブルは認識したが、user1とどの親のテーブルのcolumnsと紐づくかまだ設定していない。そのため、model上でuser1とどの親のcolumnsとidを一致させるか設定しなければならない。
ここで親のテーブル主IDと紐づけるか、親テーブルの他のcolumnと紐づけるかでmodelの書き方が異なる。
親の主IDに紐づけるパターン
public function firstUser (){
return $this->belongsTo(Parent::class, 'user1') //(親のエロクワントモデル、親と紐づける子のcolumn名)
}
ようは第三引数にわざわざ親のid columを設定しなくても勝手にuser1 = 親のIDと認識してくれる。
親テーブルの他のcolumnsに紐づけるパターン
public function firstUser (){
return $this->belongsTo(Parent::class, 'user1', 'hoge') //(親のエロクワントモデル、親と紐づける子のcolumn名, 親テーブルが持つcolumn名)
}
単純に、user1 に親テーブルのどのcolumnを紐づけますか?というのを設定しているに過ぎない。(ここでは 子テーブルのcolumn'user1'と親テーブルのcolumn'hoge')が繋がったことを意味している。
誤字脱字修正