php - 쿼리 - Laravel 4-컬렉션을 만들 때 관계에 where 절을 첨부하는 우스운 방법




라 라벨 스코프 (2)

이것은 속는 사람 일지 모르지만 나는 이것에 대한 적절한 대답을 찾고 잠시 동안 어슬렁 거리며 아직 그것을 발견하지 못했습니다.

따라서 본질적으로 두 테이블을 조인하고 조인 된 테이블의 필드를 기반으로 전체 컬렉션에 where 조건을 첨부합니다.

그래서 두 개의 테이블이 있다고 가정 해 보겠습니다.

users:
   -id
   -name
   -email
   -password
   -etc

user_addresses:
   -address_line1
   -address_line2
   -town
   -city
   -etc

인수를 위해 (이것이 최상의 예가 아닐 수도 있음) - 사용자가 여러 주소 항목을 가질 수 있다고 가정하십시오. 이제 laravel / eloquent는 컬렉션의 조건을 범위 형식으로 묶을 수있는 좋은 방법을 제공하므로 필터 중 하나를 사용하여 필터를 정의합니다.

따라서 smallville에서 주소가있는 모든 사용자를 얻으려면 다음과 같이 범위와 관계를 만들 수 있습니다.

Users.php (모델)

class users extends Eloquent{
    public function addresses(){
        return $this->belongsToMany('Address');
    }

    public function scopeSmallvilleResidents($query){
        return $query->join('user_addresses', function($join) {
                    $join->on('user.id', '=', 'user_addresses.user_id');
                })->where('user_addresses.town', '=', 'Smallville');
    }
}

이것은 작동하지만 약간 추악한데, 사용자 주소를 포함하는 멋진 동적 속성이 없기 때문에 모든 것이 묵직한 객체를 망칠뿐입니다. 모든 것이 단지 사용자 객체로 가득 차 있습니다.

이 작업을 수행하기 위해 여러 가지 다른 방법을 시도했습니다. 예를 들어 관계에 대한 결론을 사용하여 유망 해 보였습니다.

// 이것은 관계를 첨부 할 때 필터링 만하므로 모든 사용자를 표시하지만 일치하는 주소 만 가져옵니다.

User::with(array('Addresses' => function($query){
                $query->where('town', '=', 'Smallville');
            }));

// 이것은 전혀 작동하지 않습니다.

User::with('Addresses')->where('user_addresses.town', '=', 'Smallville');

그렇다면 주 컬렉션을 필터링하고 내 웅변적인 목표를 유지하는 방식으로 관계에 where 절을 적용하는 'Eloquent'방법이 있습니까? 아니면 너무 많은 다른 사람들이 내가 너무 많이 묻는 지점까지 엘로 큐트 (Eloquent)의 우아한 문법에 버릇이 있다는 것을 좋아하지 않았습니까?

참고 : 저는 일반적으로 다른 방향 (예 : 주소 테이블 액세스)에서 관계를 정의하여이 문제를 해결할 수 있지만 이것이 항상 이상적인 것은 아니며 내가 묻는 질문이 아니라는 것을 알고 있습니다.

모든 도움을 미리 감사드립니다.


이 시점에서 관련 모델의 제약 조건에 따라 기본 모델을 필터링 할 수있는 방법이 없습니다. 즉, user_address.town = 'Smallwille' 을 가진 Users 만 한 번 스 와이프 할 수는 없습니다.

개인적으로 나는 많은 사람들이 그것을 요구하는 것을 볼 수 있기 때문에 곧 구현 될 수 있기를 희망한다.

현재 해결 방법은 지저분하지만 작동합니다.

$products = array();
$categories  = Category::where('type', 'fruit')->get();
foreach($categories as $category)
{
 $products = array_merge($products, $category->products);
}
return $products;

질문에 언급 된 것처럼 먼저 주소를 필터링 한 다음 열망하는로드를 사용하여 관련 사용자 개체를로드하는 방법이 있습니다. 마찬가지로 :

$addressFilter = Addresses::with('Users')->where('town', $keyword)->first(); $users= $addressFilter->users;

물론 모델의 belongsTo와 바인딩하십시오.

/// * 그리고 누구나 독서에 미리 필터링 된 사용자 데이터를 사용하고자하는 경우에는 'with'에 클로저를 전달할 수 있습니다.

$usersFilter = Addresses::with(array('Users' => function($query) use ($keyword){ 
        $query->where('somefield', $keyword);
    }))->where('town', $keyword)->first();
$myUsers = $usersFilter->users;




eloquent