如何select基于child的child关系使用LaravelEloquent?

How to select based on child of child relationship using Laravel Eloquent?

我有以下用于商家和动态过滤器的表格结构

Merchant Table

id | name 
-------------------------
 1 | Food Supplier  

Filters

id | name 
-------------------------
 1 | Service Area
 2 | Service Cost

Filter Values

id | filter_id | value
-------------------------
 1 | 1         | Africa
 2 | 1         | Europe
 3 | 2         | 2000-4000
 4 | 2         | 4000-6000

Merchant Filter Values

id | filter_id | value_id | merchant_id
----------------------------------------
 1 | 1         | 1        | 1
 2 | 1         | 2        | 1
 3 | 2         | 4        | 1

我运行以下查询使用过滤器搜索商家:

 select * 
    from `merchants`
    where `name` LIKE "%search_term%"
    and exists (
        select * 
        from `filter_values` 
        inner join `merchant_filter_values`
        on `filter_values`.`id` = `merchant_filter_values`.`value_id` 
        where `merchants`.`id` = `merchant_filter_values`.`merchant_id`
        and (`filter_values`.`id` = 1 and filter_values.filter_id = 2)
        or (`filter_values`.`id` = 2 and filter_values.filter_id = 3)
        or etc.
    )

查询工作正常,returns 结果符合预期,唯一的问题是它不是 eloquent,所以它不会 return 从 variables/functions 附加 variables/functions例如 featured_img_url 未在结果中 return 的模型:

protected $appends = array('featured_img_url');
public function getFeaturedImgUrlAttribute()
    {
        $img_path = Config::get('app.asset_url') . "/merchants/featured/" . $this->id . ".";
        return $img_path . $this->featured_image_ext . $this->getLastUpdatedUrl();
    }

问题是,如何使用 laravel eloquent 编写这样的查询?

您必须使用 hydrate() 函数将 select 查询的结果转换为 eloquent 集合。你可以使用这样的东西:

$merchants = \DB::select( "select * 
from `merchants`
where `name` LIKE '%search_term%'
and exists (
    select * 
    from `filter_values` 
    inner join `merchant_filter_values`
    on `filter_values`.`id` = `merchant_filter_values`.`value_id` 
    where `merchants`.`id` = `merchant_filter_values`.`merchant_id`
    and (`filter_values`.`id` = 1 and filter_values.filter_id = 2)
    or (`filter_values`.`id` = 2 and filter_values.filter_id = 3)
    or etc.
)" );
return Merchant::hydrate($merchants);

您也必须定义商家模型。