2016-11-17 57 views
0

试图获得一个范围设置,让我通过一个模型(属性),基于另一个模型(用户)中的列(名称)过滤。Laravel Scope使用不同的模型(有一种关系)

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

现在,我已经试过这...

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

其“作品”不同的是它打破我的属性模型访问器。

属性和用户都有自己的表格,包含地址,城市,州和邮编的列。只有物业有哪些我使用的是访问像这样的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表中返回组合值,而不是Property表。

我在想什么最好的方法是设置这个,所以我可以通过用户名过滤属性。该属性有一个user_id列,但我正在寻找基于用户名进行过滤。

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

任何想法?我试过了我能想到的一切。

回答

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 

让我知道在评论,如果这行不通:)

+0

这非常有效!我发誓我在开始的时候尝试了一些如此接近的事情,一定是刚刚离开。这现在工作在循环和分页或任何东西。 – Octoxan

+0

@Octoxan很高兴我可以帮忙:) – prateekkathal