Laravel ORM多对多关系

时间:2017-02-10 14:34:52

标签: php laravel laravel-5 eloquent laravel-5.3

其Laravel 5.3

陷入物体关系 我有一些数据库模型,如下面的

此处客户可以拥有多个设备,设备可以拥有多个活动

我想通过客户获取所有事件,以下代码是我的模型已定义关系..

当我尝试使用([' customer']) - > get();来尝试获取DeviceEvents ::之类的事件时它只返回异常..请帮我解决这个ORM ..

customer (Model: Customer)
========
id | name

function devices = $this->hasMany('App\Devices');
--------------------------------------------------------------------------------
devices (Model: Devices)
========
id | customer_id | name

function customer = $this->belongsTo('App\Customer');
function events = $this->hasMany('App\DeviceEvents');
--------------------------------------------------------------------------------

event_logs (Model: DeviceEvents)
==========
id | device_id

function device = $this->belongsTo('App\Devices');

1 个答案:

答案 0 :(得分:3)

Eloquent从关系名称派生外键列的名称。您已将关系命名为设备,因此Eloquent假定外键列名为 devices_id 。如果要使用其他名称,则需要在创建关系时指定。

替换

$this->belongsTo('App\Devices');

$this->belongsTo('App\Devices', 'device_id');

您现在应该能够访问 $ customer->设备中的客户设备,并通过它们进行迭代,以获取每个设备的事件列表。

如果您只想获取给定客户的所有设备的事件列表,则需要在客户模型中定义新的多次通过关系:

public function events() {
  return $this->hasManyThrough('App\DeviceEvents', 'App\Devices', 'customer_id', 'device_id', 'id');
}

现在,您可以使用以下方式获取客户及其活动:

$customer = Customer::with('events')->find('YOUR_CUSTOMER');

$ customer-> events 集合中提供了所有活动。

还有一些提示:

您可以更加轻松地加载嵌套关系:

//load customer with related devices and their events
Customer::with('devices.events')->find('YOUR_CUSTOMER');

我命令通过主键获取记录,您可以使用 find()方法:

$customer = Customer::find('YOUR_CUSTOMER');