我需要直接从模型对象中过滤一对多关系给出的结果,但是我找不到正确的方法。 这里是关系:
我有一个可以隶属于许多公司的用户模型(公司模型),而一个公司可以有许多隶属于该公司的用户,所以,这是一个多对多关系。
在每个公司中,此用户都有一条个人信息,因此,每个用户可能有许多配置文件(配置文件模型),每个配置文件都属于该公司。 因此,这是一对多的关系。
想象一下,我想直接从模型中检索用户当前正在查看的公司,这是我通过过滤多对多关系而实现的:
class User extends Authenticatable
{
///
public function obtainLoggedOnCompany()
{
return $this->belongsToMany('app\Company', 'user_company', 'id', 'company_id')->withPivot('selected')->wherePivot('selected', 1)
}
然后,如果要在刀片视图中返回选定的公司,请致电:
Auth :: user()-> obtainLoggedOnCompany-> first();
感谢withPivot和wherePivot子句。
当我想检索当前所选公司的注册资料时,情况有所不同,我尝试过:
public function obtainSelectedProfile()
{
$SelectedCompany= $this->obtainLoggedOnCompany->first();
return $this->hasMany('app\Profile','user_id')->where('company_id', '=', $SelectedCompany->company_id);
}
但是它抛出了一个试图获取非对象异常的属性。 是否存在另一种直接在模型关系函数中过滤一对多关系的方法?
我使用Laravel 5.2
答案 0 :(得分:1)
您可以通过传递变量以急于加载和更新关系结构来实现此目的。试试这个
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
答案 1 :(得分:1)
您如何做:
我认为您的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);
答案 2 :(得分:0)
实际上,这句话很完美!:
Parent
我的错误在我的视野中无处不在!
尽管我认为在将数据传递到视图之前在控制器上准备数据是一种更好的做法,因为我想每次都要从用户配置文件中实时获取数据,而我不得不每次查询服务器在视图中。