Eloquent ManyToMany使用替代密钥

时间:2017-01-12 12:07:22

标签: laravel laravel-5 eloquent

我有一张表Subscribers和一张表Servicessubscriber可以有多个servicesservice可以有多个subscribers

唯一的问题是我无法通过订阅者获得任何服务。如果我查看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。

1 个答案:

答案 0 :(得分:2)

pcs_id设为主键并添加订阅者模型:

protected $primaryKey = "pcs_id";

默认情况下,它假定id为主键,而FOREIGN KEY subscriber_pcs_id实际上指向PRIMARY KEY id