2017-02-10 10 views
0

Его Laravel 5,3Laravel ORM многие ко многим

Застрял в объекты отношений Я некоторые модели DB, как следующий

Здесь клиенты могут иметь несколько устройств и устройств могут иметь несколько событий

I хочу получить все события от клиента, следующий код - мои модели с определенными отношениями.

Когда я пытаюсь получить такие события, как DeviceEvents :: with (['customer']) -> get(); он не возвращает ничего, кроме исключения .. пожалуйста, помогите мне решить эту ОРМ ..


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'); 
+0

Какая ошибка вы получаете? –

+0

Я попробовал 'Customer :: with (['devices' => function ($ query) { $ query-> с ('events'); }]) -> где ('id', 'YOUR_CUSTOMER') - > get(); 'но получение ошибки ' SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец 'device_events.customer_devices_id' –

+0

Может ли одно устройство принадлежать нескольким клиентам? Ваша структура базы данных предполагает, что она может –

ответ

3

Eloquent получает имена внешних ключей столбцов из имен отношений. Вы назвали отношение устройств, поэтому Eloquent предполагает, что столбец с внешним ключом называется devices_id. Если вы хотите использовать другое имя, вам нужно указать, что при создании отношения.

Заменить

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

с

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

Теперь вы должны иметь возможность доступа к устройствам клиента в $ Клиент-> устройства и перебирать их, чтобы получить список событий для каждого из них ,

Если вы просто хотите, чтобы получить список событий для всех устройств данного клиента, вам нужно определить новый имеет много-сквозную связь в Клиента модели:

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

Теперь, вы можете получить клиентов и их события с:

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

Все события доступны в $ Клиент-> события коллекции.

еще несколько советов:

Вы можете нетерпеливые нагрузки вложенные отношений в гораздо более простом способе:

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

Я приказываю, чтобы принести запись его первичным ключом можно использовать находки() метод:

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

Огромное спасибо за решение моей проблемы .. –