2016-02-29 2 views
0

Im пытается создать функцию в laravel, которая вернет всех последователей пользователя через динамическое свойство Laravel. Он должен выглядеть примерно так: $user->followers.Создание следящего и следующих отношений в Laravel 5

У меня также есть следующие структуры таблиц:

--users-- 
id pk 

--follows-- 
follower pk,fk 
following pk,fk 

Я пытался использовать функцию hasManyThrough в модели, но я пристанище видел пример в документации, что позволяет мне указать собственный первичный ключ в стороне от инкрементный id.

+0

Я не уверен, почему у вас будет две отдельные таблицы для последователей/следующих. Разве не было бы одной таблицы, чтобы вести запись о том, кто из них достаточно? –

+0

Нет, у меня есть одна таблица, которая называется, которая видит, кто за кого. Вышеприведенная таблица представляет собой таблицу пользователей. как последователи, так и следующие поля являются внешними ключами для таблицы пользователя – alaboudi

ответ

4

Приводя из 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.

Надеюсь, это поможет.

+0

Но мне нужно указать первичный, как мой вопрос. – alaboudi

+0

Теперь я смущен, извините. У вас сводная таблица «следует», верно? Какая колонка должна быть первичной, инкрементальной по ней? Есть ли у вас код миграции, который вы могли бы поделиться? – macghriogair

+0

Первичный ключ - это комбинация последователей и последователей. Считаете ли вы эту плохую практику и просто наложили уникальное ограничение на комбинацию? Как вы думаете, я должен увеличить его? Я рассмотрю ваш ответ. спасибо за то, что дал мне некоторый код для расширения на btw. Я очень ценю это – alaboudi

Смежные вопросы