2017-01-12 6 views
3

私はテーブルSubscribersとテーブルServicesを持っています。 subscriberは複数のservicesを持つことができ、serviceは複数のsubscribersを持つことができます。代替キーを使用したManyToMany

問題は、加入者がサービスを受けることができないことだけです。 SQLを調べるとうまくいきます。 サブスクライバはpcs_idのサービスに接続されています。

どのようにして「多対多」の関係が機能するのですか?

契約者テーブル:

| Column | Type  | Key       | 
|--------|-------------|-----------------------------| 
| id  | Int   | Primary Key, Auto increment | 
| pcs_id | Varchar(50) | Unique Key     | 
| email | varchar  | Unique Key     | 

サービステーブル:

| Column | Type | Key       | 
|--------|---------|-----------------------------| 
| id  | int  | Primary Key, Auto Increment | 
| name | varchar | Unique Key     | 

service_subscriberテーブル:

| Column   | Type  | Key       | 
|-------------------|-------------|-----------------------------| 
| id    | int   | Primary Key, Auto Increment | 
| subscriber_pcs_id | varchar(50) | Index      | 
| Service_id  | int   | Index      | 

加入者モデル:

public function Services() { 
    return $this->belongsToMany('App\Service', 'service_subscriber','subscriber_pcs_id','service_id'); 
} 

サービスモデル:

public function Subscribers() { 
    return $this->belongsToMany('App\Subscriber', 'service_subscriber','service_id', 'subscriber_pcs_id'); 
} 

私はサービスを求めるならば、私は空のコレクションを取得します。 SQLを要求すると、動作するSQL文字列が取得されます。

$subscriber = Subscriber::where('pcs_id', 'TEST_97988471')->first(); 
$services = $subscriber->Services()->toSql(); 
// SQL: select * from `services` inner join `service_subscriber` on `services`.`id` = `service_subscriber`.`service_id` where `service_subscriber`.`subscriber_pcs_id` = ? 

文字列であることはpcs_idと関係があると思います。 モデルでは、自動増分をオフにすることはできません。そうでないと、他の場所で必要なIDが失われるためです。

答えて

2

pcs_id主キーを作成して、加入者モデルに追加します。

protected $primaryKey = "pcs_id"; 

デフォルトでは、主キーとしてidを想定し、FOREIGN KEY subscriber_pcs_idは実際にPRIMARY KEY idを指しています。

+0

ありがとうございます。また、public $ incrementing = FALSEを追加する必要があります。 不利な点は、他の場所でIDを自動的に使用できないことです。 –

関連する問題