私はテーブル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が失われるためです。
ありがとうございます。また、public $ incrementing = FALSEを追加する必要があります。 不利な点は、他の場所でIDを自動的に使用できないことです。 –