如何在Laravel中动态选择所需的列

时间:2015-08-11 13:27:59

标签: laravel eloquent multilingual

嗨,伙计们,我有一张包含不同语言内容的表格。像这样:

id,name_en,name_de

现在,当我用Eloquent请求数据时,我总是这样做:

Product::with(['offers', 'category'])->select(['id', getLocalValue('name'))->find($id);

函数getLocalValue采用浏览器语言,选择当前列并将其返回为" name"。因此,当浏览器语言是英语时,我会得到像

这样的数据
{"id" => 1,
 "name" => "Englisch name"
}

我的问题:我在许多关系表中都有很多多语言内容。当使用 - > select()函数时,我必须将所有列放在此处,我想要请求。实际上,我想做的就是获得一切。但是对于因多语言而在不同列中的数据,它应该采用所需的列(如name_en)并在没有_en(名称)的情况下将其返回。

我希望你知道我的意思,可以帮助我:(感谢您的时间!!! gerti

1 个答案:

答案 0 :(得分:1)

正如我在上面评论的那样,我将更改数据结构,使其按名称在单独的表中使用语言名称。然后,如果要使用浏览器语言进行检测,可以使用它直接根据语言设置表。

将此添加到您的productName模型:

protected static $_table;

public function setTable($prefix)
{
    static::$_table = $prefix.'_productNames';
    return $this;
}

public function getTable()
{
    return static::$_table;
}

public function Product () {
    return $this->belongsTo('Product');
}

并将其添加到您的Product模型:

public function productName () {
    return $this->hasOne('productName');
}

现在您可以通过以下方式设置要使用的表:

$productName = new productName;
$productName->setTable(strtolower(getLocalValue('name'))); 

根据这个,您的表必须命名为

de_productNames

只是举个例子。

现在您可以使用以下查询:

$productName = new productName;
$productName->setTable(strtolower(getLocalValue('name'))); 
Product::with(['offers', 'category','productName'])->find($id);

我不确定你的getLocalValue()是做什么的,strtolower只是为了适应表名,如果getLocalValue()已经为你做了这个就去掉它。