Laravel 5.3: отношение hasManyThrough

У меня следующая ситуация:

location
  id - integer
  network_id - integer (FK)

network
  id - integer
  owner_id - integer (FK)

owner
  id - integer
  name - string

У меня есть модель Eloquent для данных о моем местоположении. Теперь я хочу создать RESTful API, где я могу получать данные о владельце через сетевую модель.

Я пытался использовать hasManyThrough безуспешно. Модель имеет следующие отношения;

Network - Location = One to Many
Owner - network = One to One

Так много локаций принадлежит одной сети, и у каждой сети один владелец. Это всегда так.

Я пробовал следующее.

class Location extends Model 
{
    public function owner() {
       return $this->hasManyThrough('App\Owner', 'App\Network, 'id', 'id);
    }
}

Затем верните модель в мой ресурс.

class LocationController extends Controller 
{
   public function index() {
      return [
         'data' => Location::with('network', 'owner')->take($limit)->take($offset)->get()
      ];
   }
}

Я не получаю ошибки, но модель не возвращает владельца, а просто пустой массив.

Может ли кто-нибудь помочь мне создать отношения между этими моделями, используя Eloquent Laravel? Я использую Ларавель 5.3.


person nicolinho66    schedule 02.09.2016    source источник
comment
Пожалуйста, покажите нам, что вы пробовали и какие проблемы возникли.   -  person Adrenaxus    schedule 02.09.2016


Ответы (3)


Не уверен, подходит ли структура вашей таблицы для использования hasManyThrough

Из того, что я вижу, с документацией, которая вам понадобится

location
  id - integer
  network_id - integer

network
  id - integer
  location_id - integer

owner
  id - integer
  network_id - integer
  name - string

Тогда вы могли бы использовать

 return $this->hasManyThrough(
            'App\Owner', 'App\Network',
            'location_id', 'network_id', 'id'
        );

При этом вы можете заставить его работать, попробовав различные комбинации hasManyThrough, например.

return $this->hasManyThrough('App\Owner', 'App\Network, 'owner_id', 'id', 'network_id');
person Rick Bolton    schedule 02.09.2016

связывать отношения с приведенным ниже кодом

class Location extends Model
{
 public function network()
 {
    return $this->hasMany('App\Network');
 }
}


class Network extends Model
{

 public function owner()
 {
    return $this->hasOne('App\Owner');
 }
}

это решило вашу проблему...

person Pruthviraj Chudasama    schedule 02.09.2016

Модель владельца:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Owner extends Model
{    

    public function get_data()
    {
        return $this->belongsToMany('App\Location','App\Network');
    }  

}

Модель вызова:

<?php

$data=Owner::find(1)->get_data()->select('network_id','location_id')->get();

=> Получить данные таблицы сети и местоположения, чтобы использовать опцию выбора

person Patel Abhishek    schedule 15.12.2016