2014-02-13 4 views
0

Я использовал разбиение на страницы в laravel, и в этот раз запрос очень прост. Поэтому мне удалось без проблем работать над этим. Но на этот раз у меня сложный запрос.Laravel Pagination в красноречивой ORM с()

Ниже приведен запрос:

$data['list'] = User::select('id') 
       ->with(array('contacts.contact_fields' => function($query) 
       { 
        $query->join('default_contact_method', 'contact_fields.field_type', '=', 'default_contact_method.id') 
          ->where('contact_fields.is_deleted', '=', 0); 
       })) 
       ->with(array('contacts' => function($query) 
       { 
        $query->select('contact_types.type AS type_name') 
          ->join('contact_types', 'contacts.type', '=', 'contact_types.id') 
          ->where('contacts.is_deleted', '=', 0) 
          ->paginate(2); 
       })) 
       ->where('id', '=', $user_id) 
       ->get(); 

Я использовал paginate() внутри with(), потому что я хочу, чтобы разбиваться контакты и работает нормально. Моя проблема в конце. Я не могу показать ссылки.

На вид:

{{ $list->links() }} // not working 
{{ $list[0]->contacts->links() }} // also not working 

На {{ $list[0]->contacts->links() }}

Сообщение об ошибке Call to undefined method Illuminate\Database\Eloquent\Collection::links()

кто может мне помочь?

Спасибо!

+0

Вы решили это? У меня такая же проблема. –

+0

Что вы пытаетесь достичь? Разделите контакты пользователя? –

ответ

0

Наружный, ручной набор ->contacts = Paginator::make() для внутренней после активной загрузки get().

Во-первых, $list->links() не работает, потому что ->get() возвращает коллекцию, а не экземпляр Paginator. Поэтому либо используйте ->paginate() в общем запросе, либо создайте экземпляр Paginator вручную (проверьте документы).

Что касается contacts->link Не работает, это может быть одна из двух вещей. Ваш первый with() имеет вложенное отношение (contacts.contact_fields), поэтому он может загружать контакты для вас с помощью встроенной загруженной загрузки. Если это не так, то другой, вероятно, виновником является то, что get() на самом деле делает за кулисами:

public function get($columns = array('*')) 
{ 
    $models = $this->getModels($columns); 

    // If we actually found models we will also eager load any relationships that 
    // have been specified as needing to be eager loaded, which will solve the 
    // n+1 query issue for the developers to avoid running a lot of queries. 
    if (count($models) > 0) 
    { 
     $models = $this->eagerLoadRelations($models); 
    } 

    return $this->model->newCollection($models); 
} 

Обратите внимание на newCollection - так что даже если вы на самом деле есть экземпляр Paginator, он на самом деле делает экземпляр коллекции за кулисами из предметов.

Надеюсь, это поможет. :)

+0

Я использовал ручную разбивку на страницы. Моя проблема теперь в том, почему она все еще показывает все контакты? Я могу показать ссылки на разбивку на страницы. – justin

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