2015-12-10 5 views
2

У меня есть вопрос, что я не уверен, как решить или даже фраза для поиска ответа.Laravel 5 Eloquent Many to Many 2ndary table

У меня есть модель компании & Модель пользователя, которая связана с многими из многих.

Я хочу иметь таблицу user_pins. Пользователь может принадлежать нескольким компаниям и, следовательно, иметь разные контакты в каждой компании. Штырь уникален внутри компании, ни один из двух пользователей внутри компании не может иметь один и тот же. Пользователи в разных компаниях могут иметь один и тот же.

Так что для компании это одно для многих, для пользователя это одно для многих, но в целом много для многих, я не уверен, что это имеет смысл.

У меня есть таблица создана как

Schema::create('user_pins', function (Blueprint $table) { 
$table->integer('user_id')->unsigned(); 
$table->integer('company_id')->unsigned(); 
$table->string('pin'); 

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

$table->primary(['user_id', 'company_id', 'pin']); 
}); 

Как связать эту таблицу в моделях и использовать красноречив, чтобы получить доступ/создать/обновить его, чтобы он хранит как пользователя, так и компании?

ответ

1

Во-первых, я бы сменил имя на company_user так, чтобы оно соответствовало тому же соглашению об именах, которое использовал Laravel из коробки. (вам не нужно было бы это делать, поскольку вы можете указать имя сводной таблицы в отношениях, но если нет оснований придерживаться user_pin, это делает так, чтобы следовать за соглашением :))

Тогда я бы удалил первичный ключ от соединения всех трех полей и просто введите его на company_id и user_id.

Наконец, поскольку PIN-код должен быть уникальным для компании, я бы просто поместил уникальный индекс в эти два столбца, например.

Schema::create('company_user', function (Blueprint $table) { 

    $table->integer('company_id')->unsigned()->index(); 
    $table->integer('user_id')->unsigned()->index(); 
    $table->string('pin'); 

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

    $table->primary(['company_id', 'user_id']); 
    $table->unique(['company_id', 'pin']); 
}); 

Тогда для отношений в модели я бы иметь что-то вроде:

return $this->belongsToMany('App\Company')->withPivot('pin'); 

и

return $this->belongsToMany('App\User')->withPivot('pin'); 

Примеры использования с шарниром

Все контакты пользователя для компания:

$company->users->lists('pivot.pin'); 

Пользователей шпилька для конкретной компании

$user->companies()->where('id', $id)->get()->pivot->pin; 

Пользователей шпильки для первого отношения компании:

$user->companies->first()->pivot->pin; 

Надеется, что это помогает!

+0

таблица company_user уже используется во многих отношениях во многих отношениях с таблицами компаний и пользователей. Вы говорите, что я должен просто добавить поле на эту сводную таблицу для булавки? –

+0

В таком случае, да, вы могли бы также. Не забудьте добавить составной уникальный индекс для 'company_id' и' pin'. –

+0

Это имеет смысл. Как мне получить доступ к штырю через модели компании и пользователя. Например, если бы я хотел получить все пользовательские контакты через модель компании или только пользовательский контакт для данной компании через пользовательскую модель? –

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