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

如果这不起作用,请在评论中告诉我:)