2016-05-31 2 views
0

У меня есть два стола: site_link и website_links_type. site_link связан с сайтом site_links_type с hasmany отношениями.laravel 5.2 красноречивый заказ по счету результата результата

$this->website_links->where('id',1)->Paginate(10); 

и отношения

public function broken() 
{ 
    return $this->hasMany('App\Website_links_type')->where('status_code','!=',"200"); 
} 

Теперь я хочу, чтобы получить результат от website_link таблицы, но OrderBy, что результат по кол-ву разбитого результате отношений.

ответ

0

Вы не можете установить условие WHERE в файл модели.

Вы только что дали отношение hasMany в файле модели.

И используйте, когда состояние находится на стороне контроллера.

Refer this документ.

Попробуйте

Модель файла: файл

public function broken() 
{ 
    return $this->hasMany('App\Website_links_type'); 
} 

Контроллер:

$model_name->website_links->where('id',1) 
      ->where('status_code','!=',"200") 
      ->orderBy('name', 'desc') 
      ->Paginate(10); 
+0

благодарит за ответ. и как насчет упорядочения по соотношению сломанного графа ??? –

+0

Для заказа Вы можете использовать orderBy() в контроллере. И, пожалуйста, уточните о ** отношениях сломанный счет ** –

+0

Я не знаю, о чем говорит @KetavChotaliya, но вы можете положительно положить предложение 'where' в своей модели. Если цепочка методов не указана, построитель запросов закрывается и возвращается коллекция Eloquent. Если будут предоставлены дополнительные цепочки методов, то отношение Builder добавит дополнительные аргументы в конце. – Ohgodwhy

1

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

Вы можете переносить свои отношения и использовать функцию sortBy(). Однако я не думаю, что вы можете использовать функциональность paginate() с этим решением.

Пример:

$results = Website_link::with('website_links_type')->get()->sortBy(function ($website_link) { 

    return $website_link->website_links_type->count(); 

}); 

See this answer

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

Пример:

$results = Website_link 

    ::select([ 
     '*', 
     '(
      SELECT COUNT(*) 
      FROM website_links_type 
      WHERE 
       website_links_type.website_link_id = website_link.id 
      AND 
       status_code <> 200 
     ) as broken_count' 
    ]) 

    ->orderBy('broken_count') 

    ->paginate(10); 

Вы, возможно, придется изменить имена столбцов, чтобы соответствовать вашей базы данных.

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