2016-05-11 2 views
1

Таблица пользователей: имеет zone_id поле в нем.Laravel - определение правильных отношений

Зоны стола: имеет world_id Поле в нем.

  • Каждый пользователь может находиться в одной зоне, например, zone_id = 1

  • Каждая зона принадлежит одному миру, например - world_id = 5

Мой желаемый результат возвращает пользовательскую зону и информацию о мире.

Это, как я могу сделать это без каких-либо отношений набора:

$zone = Zone::find($user->zone_Id); 
$world = World::find($zone->world_id); 
$data = $user; 
$data['zone'] = $zone; 
$data['zone']['world'] = $world; 

Мой вопрос есть .. я уверен, что отношения могут быть использованы для более чистого кода, но я не уверен, как установить это вверх.

  1. Должен ли я придерживаться текущего кода или определять отношения?
  2. Если ответ для 1 равен , определите отношение, Любая помощь в правильных отношениях между этими 3-мя моделями?

Решение 1:

`public function getZone(Request $request) 
    { 
     $token = $request->input('token'); 
     $user = JWTAuth::toUser($token); 
     // Simplest example using relationships 
     $userWithZone = User::with('zone.world')->find($user->id); // You'll get the `zone` relationship info here, too 
     return $userWithZone; 
    }` 

Ошибка: returns "Call to a member function getQuery() on null"

ответ

1

Вот пример того, как можно достичь этого с красноречивых отношений.

// User.php 
class User 
{ 
    public function zone() 
    { 
     return $this->belongsTo(Zone::class); 
    } 
} 

// Zone.php 
class Zone 
{ 
    public function world() 
    { 
     return $this->belongsTo(World::class); 
    } 
} 

Простейшим примером использования отношения

$user = User::with('zone.world')->find($id); // You'll get the `zone` relationship info here, too 

Вы можете получить более сложным с вашими отношениями, если вы хотите

$user = User::with(['zone' => function($query) { 
    $query->with('world') 
      ->select('id', 'zone_name', 'world_id'); 
})->select('username', 'zone_id')->find($id); 

или даже ...

$user = User::with(['zone' => function($query) { 
    $query->with(['world' => function($query2) { 
     $query2->select('id', 'world_name'); 
    }])->select('id', 'zone_name', 'world_id'); 
})->select('username', 'zone_id')->find($id); 

Ваш результирующие $user будет выглядеть примерно так:

'user' => [ // This is a Collection 
    'username', 
    'email', 
    'zone_id', 
    'zone' => [ // This is a Collection 
     'id', 
     'zone_name', 
     'world_id', 
     'world' => [ // This is a Collection 
      'id', 
      'world_name' 
     ] 
    ] 
]; 
+0

У меня есть ошибка при попытке вашего первым решения, я обновил свой вопрос с информацией – TheUnreal

+0

Смотрите мое обновление. Я потерял «возврат» в отношениях. – tptcat

+0

Я не уверен, что понял вопрос. Можете ли вы обновить свой первоначальный вопрос? – tptcat