所以我有两个专栏 - 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
答案 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
属性存在,请自动设置SizeY
和Sizes
。在这种情况下,您可以为SizeX
和SizeY
创建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。