2015-08-09 6 views
2

Я создаю API с микрофреймой просвета, используя Eloquent для базы данных.Eloquent hasmany issue issue

Когда я использую этот код, чтобы получить shoppinglists из группы, все работает

$group = Group::with(['shoppingLists' => function($query) { 
     }])->get(); 

возвращает следующий объект

{ 
     "id": "797799c2-6044-4a3a-a3a6-a71fbb17de68", 
     "name": "'t snackske", 
     "description": "best group ever", 
     "user_id": "7e74223a-ea06-46bf-ab1a-abb01b287e32", 
     "created_at": "2015-08-09 20:06:40", 
     "updated_at": "2015-08-09 20:06:40", 
     "shopping_lists": [ 
      { 
       "id": "2423eb3c-7dab-4672-b382-895788dec6a0", 
       "name": "shop", 
       "description": "food", 
       "user_id": "7e74223a-ea06-46bf-ab1a-abb01b287e32", 
       "group_id": "797799c2-6044-4a3a-a3a6-a71fbb17de68", 
       "created_at": "2015-08-09 20:06:40", 
       "updated_at": "2015-08-09 20:06:40" 
      } 
     ] 
} 

И когда я проверить запросы, которые регистрируются я получаю следующие запросы:

{ 
    "query": "select * from `groups`", 
    "bindings": [], 
    "time": 0.31 
}, 
{ 
    "query": "select * from `shopping_lists` where `shopping_lists`.`group_id` in (?)", 
    "bindings": [ 
     "797799c2-6044-4a3a-a3a6-a71fbb17de68" 
    ], 
    "time": 0.34 
} 

Но когда я пытаюсь выбрать определенные поля для покупок списки этот запрос не возвращает никаких записей Построитель запросов:

$group = Group::with(['shoppingLists' => function($query) { 
      $query->addSelect('id', 'name', 'description'); 
     }])->get(); 

Ответ:

{ 
     "id": "797799c2-6044-4a3a-a3a6-a71fbb17de68", 
     "name": "Group", 
     "description": "testgroup", 
     "user_id": "7e74223a-ea06-46bf-ab1a-abb01b287e32", 
     "created_at": "2015-08-09 20:06:40", 
     "updated_at": "2015-08-09 20:06:40", 
     "shopping_lists": [] 
} 

Запросы от функции getQueryLog

{ 
    "query": "select * from `groups`", 
    "bindings": [], 
    "time": 0.23 
}, 
{ 
    "query": "select `id`, `name`, `description` from `shopping_lists` where `shopping_lists`.`group_id` in (?)", 
    "bindings": [ 
     "797799c2-6044-4a3a-a3a6-a71fbb17de68" 
    ], 
    "time": 0.32 
} 

Когда я скопировать и вставить последний запрос из в журнале запросов в mysql я получаю правильную строку. По какой-то причине красноречивый не показывает данные из shopping_lists.

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Group extends Model 
{ 
    protected $increments = false; 

    protected $fillable = [ 
     'id', 
     'name', 
     'description', 
     'user_id' 
    ]; 

    protected $primaryKey = 'id'; 

    /** 
    * Get shoppinglists from this group 
    * @return \Illuminate\Database\Eloquent\Relations\HasMany 
    */ 
    public function shoppingLists() 
    { 
     return $this->hasMany('App\ShoppingList', 'group_id', 'id'); 
    } 
} 
+0

Такое же имя столбца разделяется обеими таблицами, поэтому вам может потребоваться явно указать имя таблицы в инструкции select. '$ query-> addSelect ('shoppingLists.id', 'shoppingLists.name', 'shoppingLists.description');' – Jeemusu

+0

Я попытался использовать это с '' $ query-> addSelect ('shopping_lists.id') 'с нет успеха. И обычно это не должно быть проблемой, потому что функция '(()' в построителе запросов выполняет второй оператор. @Jeemusu –

+0

Возможно, вам придется добавить столбец 'group_id' в метод' addSelect() 'для ограничения внешнего ключа. – Jeemusu

ответ

2

Вы, возможно, придется добавить ключевой столбец чуждо addSelect() метод Laravel сделать это волшебство.

Group::with(['shoppingLists' => function($query) { 
    $query->addSelect('id', 'group_id', 'name', 'description'); 
}])->get(); 
+0

Это сделало это, спасибо за быстрый ответ –