Laravel: запрос и доступ к дочерним объектам во вложенных отношениях с предложениями where отношения «многие ко многим»

Привет, у меня есть проблема, чтобы сделать мой запрос laravel

Регионы модели

class Region extends Model
{
    protected $table = 'regions';

    protected $guarded = [

    ];

    public function county()
    {
        return $this->belongsTo('App\Models\County');
    }


    public function companies()
    {
        return $this->belongsToMany('App\Models\CompanyInfo', 
        'region_company','region_id','company_id');
    }

Категория модели

class Category extends Model
{
    protected $table = 'categories';

    protected $guarded = [];


    public function companies()
    {
        return $this->belongsToMany('App\Models\Company', 'categories_company','category_id','company_id');
    }
}

Модельная компания

class Company extends Model
{

    protected $table ='companies';

    protected $guarded = [

    ];

    public function regions()
    {
        return $this->belongsToMany('App\Models\Region', 'region_company','company_id','region_id');
    }

}

У меня есть форма ввода, в которой я хочу фильтровать по категориям и регионам, а выходные данные должны быть категориями с компаниями, если это возможно, но я хочу показать только 10 компаний в каждой категории. Не уверен, что это возможно.

вот что у меня есть до сих пор

$categories = $request->input('categories');

    $region = $request->input('regions');

    $companies = Category::whereIn('id',$categories)->with([
        'companies.regions' => function ($query) use ($region) {
            $query->whereIn('id', $region);
        }])->get();

проблема здесь в том, что он фильтрует категории, но по-прежнему дает мне все компании, не отфильтровывая те, которые принадлежат определенному региону.

спасибо Дэни


person user1859876    schedule 22.06.2017    source источник


Ответы (1)


Попробуйте следующее:

$categories = $request->input('categories');
$region = $request->input('regions');

$companies = Category::whereIn('id',$categories)->with([
    'companies' => function ($query) use ($region) {
        $query->whereHas('region', function ($q2) use ($region){
            $q2->whereIn('id', $region);
        });
        $query->with(['region']);
        $query->limit(10);
    }])->whereHas('companies', function($q) use ($region) {
        $q->whereHas('region', function ($q2) use ($region){
            $q2->whereIn('id', $region);
        });
    })->get();
person clod986    schedule 22.06.2017
comment
Привет @clod986, спасибо за быстрый ответ, но я получаю синтаксическую ошибку, неожиданный '$query' (T_VARIABLE), кажется, что после $q2-›whereIn('id', $region); } отсутствует кое-что, что я пробовал; и , но все та же проблема - person user1859876; 22.06.2017
comment
@ user1859876 теперь должен работать, я забыл закрыть операторы - person clod986; 22.06.2017
comment
@user1859876 user1859876, если он выдает ошибку неопределенного идентификатора индекса, замените идентификатор на REGION_ID или REGIONS.ID - person clod986; 22.06.2017
comment
Я только что понял еще один момент, что limit (10) показывает мне только 10 результатов, но для всех категорий, а не для каждой категории. В каждой категории должно быть указано не более 10 компаний. Вы можете помочь? - person user1859876; 22.06.2017
comment
@user1859876 user1859876 Я думаю, что лучший вариант — сделать это прямо из модели. Проверьте эту ссылку laracasts.com/discuss/channels /красноречиво/ - person clod986; 22.06.2017