次のような多対多の関係があります。
user
- user_id
user_blocks
- blocker_user_id
- blocked_user_id
- unblocked (Timestamp)
blocker と blocked_user_id は複合主キーであり、どちらもユーザー テーブルの user_id への外部キーとして存在します。どちらのテーブルも InnoDB です。
次のことをしようとすると:
$user = User::find(1)
$blocked_user = $user->blocked()->where('blocked_user_id', 2)->first();
$blocked_user->unblocked = User::freshTimestamp();
$blocked_user->save();
user_blocks テーブルではなく、user テーブルの列を更新したいと考えているようです。これは単純に、ユーザー テーブルが存在しない列で更新されようとしている場合の SQL エラーunblocked
です。
例の $blocked_user の割り当てに->pivot
andを追加してみました。->pivot()
前者では Eloquent\Model::performUpdate でエラーが発生しCall to a member function update() on a non-object
、後者call_user_func_array() expects parameter 1 to be a valid callback, class 'Illuminate\Database\Query\Builder' does not have a method 'pivot'
では Eloquent\Builder::__call でエラーが発生します。
ユーザー テーブルのモデルは、それ自体との関係を次のように定義します。
public function blocked() {
return $this->belongsToMany(
'User',
'user_blocks',
'blocker_user_id',
'blocked_user_id'
)->withPivot('unblocked');
}
複合主キーを使用して Eloquent モデルを定義する方法がわからないため、user_blocks テーブルのモデルはありません (どこでも検索しましたが、誰も尋ねた質問ではないようです)。
スキーマがEloquent用に最適化されていないことは認識していますが、これは事前に確立されたスキーマを持つCodeigniterプロジェクトに雄弁を移植しています. Codeigniter モデルを使用するよりも、そうでなければ楽しい経験です。