繁体   English   中英

在Laravel中查询多对多态关系

[英]Querying Many to Many polymorphic relationship in laravel

我有以下表格:

  • contacts(id, name, email, phone_no)
  • events(id, title, start_date, end_date)
  • addresses(id, city, state, country, zip_code)
  • addressables(id, address_id, addressable_id, addressable_type)

在这里, addressables对于contacts events具有多对多态关系。 addressables还可以容纳其他多态模型类。

地址模型

public function addressable()
{
    return $this->morphTo();
}

事件/联系方式

public function addresses()
{
    return $this->morphToMany(Address::class, 'addressable');
}

我想获取地址及其关联的模型。 如果有人可以帮助我,我将不胜感激

  • 列出相关模型的地址
  • 列出特定型号的地址
  • 按型号列出地址组

更新

预期成果:

地址

id   |    address   
1    |    New York, USA
2    |    California, USA
3    |    Nevada, USA

往来

id   |    name   
1    |    Albert King
2    |    Michelle Johnson
3    |    Sujit Baniya

事件

id   |    title   
1    |    Event 1
2    |    Event 2
3    |    Event 3

addressables

id   |    address_id    |    addressable_id    | addressable_type   
1    |    1             |    1                 | Contact
2    |    2             |    1                 | Event
3    |    3             |    2                 | Contact

Address :: with('addressables')的例外结果

Address - ID 1
----Details (New York, USA)
----Contact (Albert King)
Address - ID 2
----Details (California, USA)
----Event (Event 1)
Address - ID 3
----Details (Nevada, USA)
----Contact (Michelle Johnson)

先感谢您!

根据Laravel的有关许多多态关系的文档 ,您必须编辑地址模型并添加eventscontacts如下所示:

//Get all the contacts that are assigned this address
public function contacts()
{
    return $this->morphedByMany('App\Contact', 'addressable');
}

//Get all the events that are assigned this address
public function events()
{
    return $this->morphedByMany('App\Event', 'addressable');
}

回答你的问题

然后,要获取联系人的所有地址 ,可以使用addresses动态属性,如下所示:

$contact = App\Contact::find(1);

foreach ($contact->addresses as $address) {
    //
}

对于事件:

$event = App\Events::find(1);

foreach ($event->addresses as $address) {
    //
}

最后 ,您可以检索地址事件和联系人,如下所示:

$address = App\Address::find(1);

foreach ($address->events as $event) {
    //
}

foreach ($address->contacts as $contact) {
    //
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM