【问题标题】:Laravel Scope using different Model (has a relationship)Laravel Scope 使用不同的模型(有关系)
【发布时间】:2016-11-17 19:55:53
【问题描述】:

试图获得一个范围设置,让我可以根据另一个模型(用户)中的列(名称)过滤一个模型(属性)。

我有一个关系设置到一个用户有许多属性,一个属性属于一个用户。

现在我已经尝试过了...

public function scopeFilterByUser($query, $user)
{
    return $query->join('users', function($join) use ($user)
    {
        $join->on('properties.user_id', '=', 'users.id')
            ->where('name', 'LIKE', '%'.$user.'%');
    });
}

除了它破坏了我在属性模型上的访问器之外,它“有效”。

Property 和 User 都有自己的表,其中包含地址、城市、州和邮政编码的列。只有 Property 有一个 full_address 列,我正在使用这样的访问器...

public function getFullAddressAttribute($value)
{
    $address = $this->address;
    $city    = $this->city;
    $state   = $this->state;
    $zipcode = $this->zipcode;
    return $address.', '.$city.', '.$state.', '.$zipcode;
}

这两个都在属性模型中。由于某种原因,在使用此 filterByUser 过滤属性后访问 $property->full_address 时。full_address 会返回来自用户表而不是属性表的组合值。

我想知道最好的设置方法是什么,以便我可以按用户名称过滤属性。该属性确实有一个 user_id 列,但我希望根据用户名进行过滤。

如果我将所有属性地址字段重命名为 prop_address、prop_city 等,这一切都有效……但这并不理想。

有什么想法吗?我已经尝试了所有我能想到的。

【问题讨论】:

    标签: laravel eloquent laravel-5.3


    【解决方案1】:

    您可以尝试将您的范围更改为:

    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
    

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

    【讨论】:

    • 这非常有效!我发誓我一开始就尝试过如此接近的东西,一定是刚刚结束。这现在可以在循环和分页或任何东西中使用。
    • @Octoxan 很高兴我能帮上忙 :)
    猜你喜欢
    • 2014-11-28
    • 2018-12-29
    • 2017-07-07
    • 1970-01-01
    • 2019-03-25
    • 2016-05-01
    • 2018-04-18
    • 2021-05-31
    • 1970-01-01
    相关资源
    最近更新 更多