Eloquent filtering of nested

六眼飞鱼酱① 提交于 2019-12-13 05:39:08

问题


I have a db modelled like this:

User
+ id
+ email
+ password 

Profile
+ id
+ owner_id (FK user.id)
+ type_id (FK types.id)
+ address_id (FK addresses.id)
+ org_name
+ phone
+ email
+ url
  etc

Postings
+ id
+ profile_id (FK profiles.id)
+ title
+ description

Addresses
+ id
+ street
+ city 
+ province_id (FK provinces.id)
+ country_id (FK countries.id)
  etc

Countries
+ id
+ name

Provinces
+ id
+ name
+ abbreviation
+ country_id

I am trying to use Eloquent ORM to query a set of Postings from this based upon type_id, city, country_id and/or province_id. These fields are on the subordinate object $posting->profile->address, etc.

Am I going to have to dumb-down my db - flatten out the profile by merging the address data into it? Or is there a way to do this in Eloquent without remodelling all my data?


回答1:


Assuming you have defined a relationship of address for profile,

$posts = Posting::with([
    'profile' => function($query) use ($type_id)
    {
        $query->whereTypeId($type_id)
    },
    'profile.address' => function($query) use ($country_id, $province_id)
    {
        $query->whereCountryId($country_id)
              ->whereProvinceId($province_id);
    }
])->get();



回答2:


This is how you filter the table based on constraints in related tables:

// we need to pass all the ids to the closure, so use one array for convenience:
$filters = [
    'typeId'     => 1,
    'addressId'  => 5,
    'provinceId' => 10,
    'countryId'  => 15
];

$posts = Posting::whereHas('profile', function ($q) use ($filters) {
  $q->where('type_id', $filters['typeId'])
    ->whereHas('address', function ($q) use ($filters) {
      $q->where('id', $filters['addressId'])

        // both below wheres don't make sense used together, just an example
        ->where('province_id', $filters['provinceId'])
        ->where('country_id', $filters['countryId']);
    });
});

It will set 2 joins and check those where clauses, so you will fetch only those posts, that meet the requirements, but nothing is eager loaded here (with is for eager loading, but it doesn't filter the main model, only those eager loaded).



来源:https://stackoverflow.com/questions/24976917/eloquent-filtering-of-nested

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!