Как отфильтровать laravel красноречивых результатов по отношениям? - PullRequest
0 голосов
/ 06 марта 2020

У меня есть две модели TeamleaderCompany, которые: имеют много TeamleaderCompanyTag

TeamleaderCompany

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

TeamleaderCompanyTag

public function teamleaderCompany()
{
    return $this->belongsTo(TeamleaderCompany::class);
}

, когда у меня TeamleaderCompany::all() у меня есть эти результаты:

(...)
      "teamleader_company_tags": [
        {
          "id": 7,
          "tag": "hot lead",
          "teamleader_company_id": 3,
          "created_at": "2019-09-03 09:23:51",
          "updated_at": "2019-09-03 09:23:51"
        },
        {
          "id": 8,
          "tag": "reseller",
          "teamleader_company_id": 3,
          "created_at": "2019-09-03 09:23:51",
          "updated_at": "2019-09-03 09:23:51"
        }
      ]
(...)

Я пытаюсь показать TeamleaderCompany результаты, где teamleaderCompanyTags имеет только один tag, который равен 'reseller' (если есть другой тег, кроме 'reseller 'не показывать)

$companies->whereHas(
    'teamleaderCompanyTags',
    function ($query) use ($condition) {
        $query->where('tag',
            (...)
        );
    }
);

спасибо

Ответы [ 3 ]

1 голос
/ 06 марта 2020

Попробуйте этот метод

TeamleaderCompany::with('teamleaderCompanyTags:id,tag')
->whereHas('teamleaderCompanyTags',function(\Illuminate\Database\Eloquent\Builder $query){
                        $query->where('tag', "reseller");
                    })->get();
1 голос
/ 06 марта 2020

Попробуйте этот запрос:

TeamleaderCompany::has('teamleaderCompanyTags', '=', 1)     // companies that have only one tag
    ->whereHas('teamleaderCompanyTags', function ($query) { // companies that have `reseller` tag
        $query->where('tag', 'reseller');
    })
    ->get()
0 голосов
/ 06 марта 2020

У вас есть два условия.

  • он должен иметь тег "reseller"
  • это единственный тег, который имеет
TeamleaderCompany::whereHas('teamleaderCompanyTags', function ($query) {
        $query->where('tag', 'reseller');
    })
    ->whereDoesntHave('teamleaderCompanyTags', function ($query) {
        $query->where('tag', '!=', 'reseller');
    })
    ->get()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...