过滤一对多关系记录结果
Filter a one to many relation record result
我需要直接从模型 object 中过滤一对多关系给出的结果,但我找不到正确的方法。
这里,关系:
我有一个User模型,可以订阅很多公司(company model),一个公司可以有很多用户订阅它,所以,是多对多的关系。
在每个公司中,该用户都有一个个人信息,因此,每个用户都可以拥有多个个人资料(个人资料模型),每个公司都订阅了一个。
所以这是一个一对多的关系。
假设我想直接从模型中检索用户当前正在查看的公司,我通过过滤多对多关系来实现:
class User extends Authenticatable
{
///
public function obtainLoggedOnCompany()
{
return $this->belongsToMany('app\Company', 'user_company', 'id', 'company_id')->withPivot('selected')->wherePivot('selected', 1)
}
然后,如果我想 return 在 blade 视图中选择公司,我只需调用:
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);
}
但它抛出一个 Trying to get 属性 of non object 异常。
有没有其他方法可以直接在模型关系函数中过滤一对多关系?
我正在使用 Laravel 5.2
您可以通过将变量传递给预加载和更新您的关系结构来实现此目的。试试这个
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
你呢:
我假设您的 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);
其实这句话很完美!:
public function obtainSelectedProfile()
{
$SelectedCompany= $this->obtainLoggedOnCompany->first();
return $this->hasMany('app\Profile','user_id')->where('company_id', '=',
$SelectedCompany->company_id);
}
我认为我的错误在其他地方!
虽然我认为在将数据传递给视图之前在控制器上准备数据是更好的做法,因为每次我想从用户那里获取数据时我都必须查询服务器 在视图中动态配置文件。
我需要直接从模型 object 中过滤一对多关系给出的结果,但我找不到正确的方法。 这里,关系:
我有一个User模型,可以订阅很多公司(company model),一个公司可以有很多用户订阅它,所以,是多对多的关系。
在每个公司中,该用户都有一个个人信息,因此,每个用户都可以拥有多个个人资料(个人资料模型),每个公司都订阅了一个。 所以这是一个一对多的关系。
假设我想直接从模型中检索用户当前正在查看的公司,我通过过滤多对多关系来实现:
class User extends Authenticatable
{
///
public function obtainLoggedOnCompany()
{
return $this->belongsToMany('app\Company', 'user_company', 'id', 'company_id')->withPivot('selected')->wherePivot('selected', 1)
}
然后,如果我想 return 在 blade 视图中选择公司,我只需调用:
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);
}
但它抛出一个 Trying to get 属性 of non object 异常。 有没有其他方法可以直接在模型关系函数中过滤一对多关系?
我正在使用 Laravel 5.2
您可以通过将变量传递给预加载和更新您的关系结构来实现此目的。试试这个
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
你呢:
我假设您的 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);
其实这句话很完美!:
public function obtainSelectedProfile()
{
$SelectedCompany= $this->obtainLoggedOnCompany->first();
return $this->hasMany('app\Profile','user_id')->where('company_id', '=',
$SelectedCompany->company_id);
}
我认为我的错误在其他地方!
虽然我认为在将数据传递给视图之前在控制器上准备数据是更好的做法,因为每次我想从用户那里获取数据时我都必须查询服务器 在视图中动态配置文件。