2017-01-16 10 views
0

Я использую Laravel 5.3 и у меня есть сценарий следующим образомКак использовать Полиморфные отношения в Laravel 5.3?

У меня есть 2 модели

  1. Robot
  2. Расположение

Робот может иметь много местоположений, но местоположение может принадлежать до 1 робота, и каждый раз, когда у Робота есть новое место, счет поле в местоположении Таблица увеличится

Что я пытаюсь, так это то, что я хочу использовать связь полиморфов с Laravel и Eloquent, я хочу, чтобы все местоположения всех роботов были обновлены последним с помощью distinct()?

К слову, Locatable_id в таблице местоположений относится к идентификатору робота. вот мои модели

Робот модели

public function locations() { 
     return $this->morphMany('App\Models\Location', 'locatable'); 
    } 

Расположение Модель

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

}

Местоположение Таблица

enter image description here

Любая помощь будет действительно оценена. Благодарю.

+0

Можете ли вы объяснить мне, почему вы хотите использовать полиморфные отношения? если каждому роботу требуется место, которое просто 1: N. –

+1

Действительно, роботы-локации кажутся мне один-ко-многим. – JoeriShoeby

ответ

0

В приведенном ниже ответе возвращаются все роботы, и для каждого из них предоставляется последнее место. Внутренняя функция может использоваться для фильтрации данных locations.

Robot::with(['locations' => function($q) { 
    $q->latest(); 
}])->get(); 


, что я пытаюсь, что я хочу использовать полиморфные отношения с Laravel и красноречивым, я хочу, чтобы получить все расположения всех роботов на последнее обновление с помощью отчетливого()?

Это не полностью достигает вашей цели, но я думаю, что это хороший момент для начала.

+0

Это одно-много полиморфное отношение, поскольку многие объекты могут иметь места, например, у пользователя может быть один! поскольку у Клиента может быть много роботов и много пользователей, мы можем использовать «местоположение» в качестве хранителя адресов для клиентов, например. –

+0

Я отредактирую свой ответ, как только это возможно. Это не должно быть жестким достижением вашей цели. –

+0

Это то, что я пытаюсь использовать Tinker App \ Models \ Location :: distinct ('locateable_id') -> get (['updated_at']) -> all(); –

1

Вот как я решить :)

// Grap all Robots with it's locations and Customer 
    $robots = Robot::whereHas('locations', function($query){ 
    $query->whereNotNull('locatable_id')->orderBy('updated_at'); 
    })->with('locations')->with('customers')->get(); 

//Filter only latest Locations for each Robot 
    $filterLocations= $robots->map(function($robot){ 
    $robot->timeEntries = $robot->locations() 
     ->orderBy('updated_at', 'DESC') 
     ->limit(1) 
     ->get(); 
    return $robot; 
    }); 

Цените ваш тратить время на выручает :) Спасибо samuele-colombo

+0

Я рад вам. Я думаю, что ваше решение может быть более элегантным (возможно, вы можете сделать это, чтобы фильтровать «местоположения» непосредственно в первом предложении). –

+0

В соответствии с http://stackoverflow.com/questions/30231862/laravel-eloquent-has-with-wherehas-what-do-they-mean 'whereHas' возвращает только« роботы », которые имеют (_not null и упорядочены по updated_at_) 'Locations', но я думаю, что вы можете напрямую фильтровать их в методе' with'. –

Смежные вопросы