Laravel在where子句中使用动态mutators

时间:2017-10-20 11:08:02

标签: php laravel search laravel-5.1 mutators

所以我有两个专栏 - SizeX& SIZEY。对于前端用户,我使用Laravel mutator

public function getSizeAttribute(){
    /**
     * Set Size
     */
    $size = $this->SizeX. " x ". $this->SizeY;
    /**
     * Return
     */
    return $size;
}

格式化此SizeX x SizeY之类的尺寸。列Sizes不存在,因为它是动态的。是否可以在Elaquent模型中使用mutator或替代方法来检测这是一个动态属性,并使用某种方法将SizeX x SizeY转换为单个列?一旦用户将属性Size提交回laravel应用程序进行过滤?

编辑:

是的,这是我用来检索过滤物品的方法

public function scopeFilteredMaterials($query,$params = array()){ 
    /**
     * Get filters
     */
    $filters = array();
    /**
     * Extract Info
     */
    if(!empty($params) && is_array($params)){
        /**
         * Get Available Filters
         */
        $filters = $this->getAvailableFilters();

        foreach ($filters as $key => $filter){
            if(isset($params[$filter])){

                $filters[$filter] = $params[$filter];

                unset($filters[$key]);
            }else{

                unset($filters[$key]);
            }
        }
    }

    foreach ($filters as $key => $filter){

        $query->whereIn(key ,$filter);
    }

    $result = $query->get();
}

这是过滤器变量,其中包含可供用户查看的过滤器

protected $filters = array( "Name", "url", "Size", );

我使用上述内容向用户显示特定值。一旦用户选择了这些值,我就会使用相同的数组来检查这些过滤器并触发查询。我的问题是Size属性由两列组成,我没有使用以下Mutator和$appends变量来自动将值带给用户。

/**
 * Get Size Attribute
 */
public function getSizeAttribute(){
    /**
     * Set Size
     */
    $size = $this->SizeX. " x ". $this->SizeY;
    /**
     * Return
     */
    return $size;
}

但是我找不到将Size变量转换回SizeX&的方法。 SizeY

2 个答案:

答案 0 :(得分:2)

如果始终通过访问器创建复合变量,则可以使用解析此字符串的范围。像这样:

public function scopeSize($query, $size)
{
    $sizes = explode(' x ', $size);
    return $query->where('SizeX',  $sizes[0])->where('SizeY', $sizes[1]);
}

然后,您可以在过滤方法或其他任何位置使用此范围。

答案 1 :(得分:0)

如果要创建新的动态属性,只需创建一个访问者:

public function getSizesAttribute()
{
    return $this->SizeX . ' x ' . $this->SizeY;
}

如果您想SizeX属性存在,请自动设置SizeYSizes。在这种情况下,您可以为SizeXSizeY创建mutators。例如:

public function setSizeXAttribute($value)
{
    if (!empty($this->attributes['Sizes'])) {
        $this->attributes['SizeX'] = explode(' x ', $this->attributes['Sizes']))[0];
    }
}

public function setSizeYAttribute($value)
{
    if (!empty($this->attributes['Sizes'])) {
        $this->attributes['SizeY'] = explode(' x ', $this->attributes['Sizes']))[1];
    }
}

PS:这是标准snake_case属性的解决方案,如size_x。我真的建议你在Laravel中使用它们。如果您仍想使用SizeX,还应该do this