Laravel выполняет множество операций через оператор where

#laravel #laravel-5.2

#laravel #laravel-5

Вопрос:

Я хочу получать проекты с помощью Auth::user() and company_id . Я создал следующее:

База данных:

 projects:
    - id
    - name
    - company_id
project_users:
    - id
    - project_id
    - user_id
users:
    - id
    - name
    - email
companies:
    - id
    - name
  

Итак, я хочу получить текущие пользовательские проекты, которые принадлежат company_id .

Я попробовал следующее с User Modal -> return $this->hasManyThrough('AppProjectUsers', 'AppProject') помощью . $user->projects->where('company_id', 1) но он возвращает все данные (также с company_id 2,3,4 и т.д.).

Я ищу решение, которое может отфильтровывать проекты с company_id 1 из запроса.

Комментарии:

1. Возвращается ли hasManyThrough из метода проектов вашей пользовательской модели?

2. hasManyThrough возвращается из пользовательской модели.

3. Вы должны просто опубликовать свой код модели пользователя.

Ответ №1:

Вы должны создать функцию в модели пользователя

 public function projectusers() {
        return $this->hasMany('AppModelsproject_users', 'projectID')->with('companies');
    }
  

теперь создайте функцию в модельных проектах

 public function companies() {
    return $this->hasMany('AppModelscompanies','id', 'company_id');
}
  

Комментарии:

1. Как мне получить проекты только where company = 1 ?

2. возвращает $this->hasMany(‘AppModelscompanies’,’id’, ‘company_id’)->where(‘company’, 1);

Ответ №2:

Если вы пытаетесь ограничить отношение на основе результатов другого отношения, тогда вам нужно использовать whereHas .

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

 $projects = AppProject::whereHas('company', function($q) use ($company_id) {
    $q->where('id', $company_id);
})->with('users')->get();
  

Это позволит захватывать только проекты, принадлежащие определенной компании, а также загружать пользователей.

По мере выполнения цикла вы можете получить количество пользователей, используя отношение.

 foreach ($projects as $project) {
    echo 'Num User: '.$project->users->count();
}
  

Комментарии:

1. Пользователи, связанные с проектами, находятся в отдельной таблице project_users . В проекте может быть 0 или более пользователей.

2. О, я понимаю, что вы говорите, я думаю, это близко к тому, что вы хотите, но как вы получаете проект от пользователей, если может быть 0, 1 или много пользователей?

3. Мне нужна страница, на которой системный администратор может видеть, сколько проектов у пользователя. Так, например user1 is assigned to 6 projects , и user2 is assigned to 1 project . Вот в чем причина этого. Но системному администратору из компании 1 не разрешено видеть, связан ли пользователь с другой компанией и сколько у них проектов.

4. Хорошо, это имеет больше смысла, вы просто хотите загружать пользователей вместе с проектами после того, как вы уже ограничили проекты на основе идентификатора компании. Я обновил код.