Приводя из docs:
Если вы хотите, чтобы настроить ключи от отношений, вы можете передать их в качестве третьих и четвертых аргументов метода thehasManyThrough. Третий аргумент - это имя внешнего ключа промежуточной модели, а четвертый аргумент - имя внешнего ключа в конечной модели.
Вы должны иметь возможность передавать свои имена столбцов пользовательских внешних ключей, как описано там.
--EDIT: После некоторого отражения, думаю, hasManyThrough
не подходит для достижения того, чего вы хотите достичь (по крайней мере, с небольшой информацией, представленной в вопросе). Вместо belongsToMany
должны сделать:
В новой установке Laravel 5.2, я создал миграцию для такой сводной таблицы (вдохновленный другой post):
public function up()
{
Schema::create('follows', function (Blueprint $table) {
// Edit 2 without an incremental id
// $table->increments('id');
$table->integer('follower_id')->unsigned();
$table->integer('followee_id')->unsigned();
$table->foreign('follower_id')->references('id')
->on('users')
->onDelete('cascade');
$table->foreign('followee_id')->references('id')
->on('users')
->onDelete('cascade');
// Edit 2: with primary and unique constraint
$table->primary(['follower_id', 'followee_id']);
$table->unique(['follower_id', 'followee_id']);
});
}
И в App \ User Модель
public function followers()
{
return $this->belongsToMany(
self::class,
'follows',
'followee_id',
'follower_id'
);
}
public function followees()
{
return $this->belongsToMany(
self::class,
'follows',
'follower_id',
'followee_id'
);
}
Затем, после посева некоторых пользователей и сводных отношений, это работает для меня:
$user = User::first();
// user is followed by
echo json_encode($user->followers()->get());
// user is following
echo json_encode($user->followees()->get());
В первой версии этого (тривиального) примера были два первичных ключа: 'id' на 'users' и 'id' on 'follow', то есть по умолчанию по соглашению. Вы можете переопределить свой pk в своей модели, например, protected $primaryKey = 'user_id';
. На этом есть post. Теперь сводная таблица имеет составной ключ, который должен быть уникальным, и это было намерение OPs, которое я предполагаю.
- Edit 2: С ограничениями на месте, вы должны добавить последователей так:
$user->followers()->sync([$anotherUser->id],false);
для того, чтобы избежать целостности нарушение ограничения, если составной ключ должен существовать уже. Предлагается метод синхронизации here.
Надеюсь, это поможет.
Я не уверен, почему у вас будет две отдельные таблицы для последователей/следующих. Разве не было бы одной таблицы, чтобы вести запись о том, кто из них достаточно? –
Нет, у меня есть одна таблица, которая называется, которая видит, кто за кого. Вышеприведенная таблица представляет собой таблицу пользователей. как последователи, так и следующие поля являются внешними ключами для таблицы пользователя – alaboudi