2015-08-11 5 views
1

Привет, ребята, у меня есть таблица с контентом на разных языках. как это:Как динамически выбирать нужные столбцы в Laravel

ID, Имя Цены, name_de

Теперь, когда я запрашиваю данные с красноречивым я всегда делал это:

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

Функции getLocalValue принимает браузер-язык, выбирает текущий столбец и возвращает его как «имя». Поэтому, когда язык браузера английский получить данные как

{"id" => 1, 
"name" => "Englisch name" 
} 

Моей проблему: У меня есть много контента многоязыкового в множестве таблиц с отношениями. И при использовании функции -> select() я должен поместить все столбцы здесь, которые я хочу запросить. На самом деле все, что я хочу сделать, это все. Но для данных, которые находятся в разных столбцах из-за многоязычности, он должен взять нужный столбец (например, name_en) и вернуть его без _en (name).

Я надеюсь, что вы знаете, что я имею в виду, и может помочь мне здесь :(Спасибо за ваше время !!! Герти

+1

Это, главным образом, проблема сохранения данных не в том направлении. То, как вы это делаете сейчас, представьте, что вы тоже хотите продать во Франции. Вам нужно будет изменить все ваши таблицы >>> Плохая идея. Лучше сделайте таблицу для каждого языка, а затем установите таблицу динамически. например В таблице 'de_names' хранятся только внешние ключи' id' и 'name', то же самое относится к другим языкам, а затем просто выбирайте их – baao

+0

Ну, я знаю, что вы имеете в виду спасибо! Но как и когда я выбираю правильный переводный стол? Должен ли я делать это в модели и генерировать ее там динамично? – gerti

+0

Вы можете установить таблицу, которую хотите использовать в своей модели продукта. Я отправлю ответ – baao

ответ

1

Как я заметил выше, я бы изменить структуру данных, чтобы иметь названия языка в . отдельная таблица по имени Затем, если вы хотите использовать язык браузера для обнаружения, вы можете использовать это, чтобы непосредственно установить таблицу в соответствии с языком

Добавьте это в productName Model:.

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() уже делает это для тебя.

+0

Большое спасибо за это! :) Я понимаю, как он работает. Но странно иметь модель для каждого столбца, который нужно перевести. Мое приложение будет довольно большим, поэтому у меня будет тонна этих моделей.Я все равно постараюсь сделать это сейчас :) Спасибо! – gerti

+0

Вам не нужна модель для каждого столбца, если вам нужно сейчас, измените свой набор данных, чтобы максимально упростить его. – baao

+0

Хмм, простите, я не знаю, что вы имеете в виду. Как я понимаю, у меня будет одна таблица для каждого столбца на каждом языке, который я хочу перевести. А также одна модель для столбца. Как вы делали это выше с помощью productName Model – gerti

Смежные вопросы