Laravel Scope使用不同的模型(有关系)

时间:2016-11-17 19:55:54

标签: laravel eloquent laravel-5.3

尝试获取范围设置,让我根据另一个模型(用户)中的列(名称)筛选一个模型(属性)。

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

现在我试过了......

JTable

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

Property和User都有自己的表,其中包含地址,城市,州和邮政编码的列。只有Property有一个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.'%');
    });
}

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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