Laravel Scope using different Model(有关系)
Laravel Scope using different Model (has a relationship)
尝试获得一个范围设置,让我可以根据另一个模型(用户)中的列(名称)过滤一个模型(属性)。
我有一个关系设置到一个用户有很多属性,属性 属于一个用户。
现在我已经试过了...
public function scopeFilterByUser($query, $user)
{
return $query->join('users', function($join) use ($user)
{
$join->on('properties.user_id', '=', 'users.id')
->where('name', 'LIKE', '%'.$user.'%');
});
}
"works" 除了它破坏了我的 属性 模型上的访问器。
属性 和用户都有自己的 table,包含地址、城市、州和邮政编码的列。只有 属性 有一个 full_address 列,我正在使用这样的访问器...
public function getFullAddressAttribute($value)
{
$address = $this->address;
$city = $this->city;
$state = $this->state;
$zipcode = $this->zipcode;
return $address.', '.$city.', '.$state.', '.$zipcode;
}
这两个都在 属性 模型中。出于某种原因,在使用此 filterByUser 过滤属性后访问 $属性->full_address 时。full_address 返回用户 table 的组合值,而不是 属性 table.
我想知道最好的设置方式是什么,以便我可以按用户名过滤属性。 属性 确实有一个 user_id 列,但我希望根据用户名进行过滤。
如果我将所有 属性 地址字段重命名为 prop_address、prop_city 等,一切都有效...但这并不理想。
有什么想法吗?我已经尝试了所有我能想到的。
您能否尝试将范围更改为:
public function scopeFilterByUser($query, $user)
{
return $query->whereHas('users', function($q) use ($user) {
$q->where('name', 'like', '%' . $user . '%');
});
}
然后您可以将其用作
$properties = Property::filterByUser('name')->get();
// Then
$properties->first()->full_address
如果这不起作用,请在评论中告诉我:)
尝试获得一个范围设置,让我可以根据另一个模型(用户)中的列(名称)过滤一个模型(属性)。
我有一个关系设置到一个用户有很多属性,属性 属于一个用户。
现在我已经试过了...
public function scopeFilterByUser($query, $user)
{
return $query->join('users', function($join) use ($user)
{
$join->on('properties.user_id', '=', 'users.id')
->where('name', 'LIKE', '%'.$user.'%');
});
}
"works" 除了它破坏了我的 属性 模型上的访问器。
属性 和用户都有自己的 table,包含地址、城市、州和邮政编码的列。只有 属性 有一个 full_address 列,我正在使用这样的访问器...
public function getFullAddressAttribute($value)
{
$address = $this->address;
$city = $this->city;
$state = $this->state;
$zipcode = $this->zipcode;
return $address.', '.$city.', '.$state.', '.$zipcode;
}
这两个都在 属性 模型中。出于某种原因,在使用此 filterByUser 过滤属性后访问 $属性->full_address 时。full_address 返回用户 table 的组合值,而不是 属性 table.
我想知道最好的设置方式是什么,以便我可以按用户名过滤属性。 属性 确实有一个 user_id 列,但我希望根据用户名进行过滤。
如果我将所有 属性 地址字段重命名为 prop_address、prop_city 等,一切都有效...但这并不理想。
有什么想法吗?我已经尝试了所有我能想到的。
您能否尝试将范围更改为:
public function scopeFilterByUser($query, $user)
{
return $query->whereHas('users', function($q) use ($user) {
$q->where('name', 'like', '%' . $user . '%');
});
}
然后您可以将其用作
$properties = Property::filterByUser('name')->get();
// Then
$properties->first()->full_address
如果这不起作用,请在评论中告诉我:)