Отфильтруйте результат записи отношения один ко многим - PullRequest
0 голосов
/ 28 мая 2019

Мне нужно отфильтровать результаты, полученные из отношения один ко многим, непосредственно из объекта модели, но я не могу найти правильный путь. Здесь отношения:

У меня есть модель User, которая может работать со многими компаниями (модель компании), и у компании может быть подписано много пользователей, поэтому отношение «многие ко многим».

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

Представьте, что я хочу получить компанию, которую пользователь в данный момент просматривает, непосредственно из модели, что, я достигаю, отфильтровав отношение многие ко многим:

class User extends Authenticatable
{
///
 public function obtainLoggedOnCompany()
 {
   return $this->belongsToMany('app\Company', 'user_company', 'id', 'company_id')->withPivot('selected')->wherePivot('selected', 1)  
 }

Затем, если я хочу вернуть выбранную компанию в режиме блэйда, я просто звоню:

Auth :: пользователя () -> obtainLoggedOnCompany-> первый ();

Все благодаря предложению withPivot и wherePivot.

Другой случай, когда я хочу получить зарегистрированный профиль выбранной в данный момент компании, я попытался:

public function obtainSelectedProfile()
{
$SelectedCompany= $this->obtainLoggedOnCompany->first();

return $this->hasMany('app\Profile','user_id')->where('company_id', '=', $SelectedCompany->company_id);
}

Но он бросает попытку получить свойство Exception, не являющееся объектом. Есть ли другой способ отфильтровать отношения один ко многим непосредственно в функции отношения модели?

Я использую Laravel 5.2

Ответы [ 3 ]

1 голос
/ 28 мая 2019

Как насчет вас:

Я предполагаю, что ваша модель Company.php имеет

public function userProfile(){
return $this->hasMany('app\Profile','company_id');
}

И попробуйте это на контроллере:

    $company_id=1; //suppose the current company viewing id is 1
        $user = User::where('id',Auth::id())->with(['obtainLoggedOnCompany'=>function($query) use($company_id){
        $query->where('company_id',$company_id);
        $query->with(['company_user_profile'=>function($query){
         $query->where('user_id',Auth::id());
         $query->last();
        }]);
        //$query->last();
        }])->first();

А выможно получить профиль, используя:

dd($user->obtainLoggedOnCompany->company_user_profile);
1 голос
/ 28 мая 2019

Этого можно добиться, передав переменную в готовую загрузку и обновив структуру отношений.Попробуйте это

User Модель:

class User extends Authenticatable
{
    ///
    public function obtainLoggedOnCompany()
    {
         return $this->belongsToMany('App\Company', 'user_company', 'user_id', 'company_id'); 
    }

}

Company Модель:

class Company extends Model
{
    ///
    public function profile()
    {
        return $this->hasOne('App\Profile', 'company_id');  
    }
}

Example Вариант использования этого:

$user_id = 1;
$user = User::where('id', $user_id)->with(['company' => function($query) use ($user_id) {

           return $query->with(['profile' => function($query2) use ($user_id) {
                                              return $query2->where('user_id', $user_id);
                                            }]);
        }])->first();
// $user variable contains user details, company details, and profile
0 голосов
/ 30 мая 2019

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

...