Вы поднимаете много хороших вопросов, на которые также нужно ответить. У нас нет точного контекста ваших «проблем», но вы дали нам немного информации, которая может быть полезна для понимания того, о чем вы просите.
Итак, вот мои два цента:
Задача 1
Вы указываете как на понятия composite primary keys
, так и composite unique keys
SQL, которые отлично подходят для работы с комбинированными клавишами, которые относятся к модели вашего приложения. Как указывалось вначале 4 года go (столько!) На это топи c, сегодня действительно нет никакого способа получить эту естественную работу от Eloquent. Но есть обходной путь, чтобы это работало замечательно.
Я бы предпочел использовать composite primary keys
, чтобы убедиться, что база действительно равна solid и избежать ошибок при перемещении строк в базе данных. Я бы сказал, что это зависит от вас, с какой-то степенью терпимости в отношении потенциальных ошибок или пробелов, которые вы, возможно, забыли при разработке своего приложения.
Мне не очень нравится идея № 1, потому что в моем мнение, что нет чудесной и прагматичной причины иметь автоинкрементный ключ здесь. Я всегда держу в уме принцип "KISS" ("Делай это глупо просто"). SQL предлагает способ комбинирования ключей изначально (и он работает очень хорошо в общих целях), "зачем мне go с еще одним ключом, если он не подходит для действительно полезной функции моего приложения?"
Laravel сильно вырос, но постоянно обновляется и совершенствуется каждый месяц. Мне очень нравится этот фреймворк, но в нем всегда отсутствуют ценные вещи, и поэтому открытый исходный код так важен. Он предлагает какой-то способ создания Traits
, Interface
, Helpers
для извлечения, обновления и поиска строк с помощью пары первичных ключей, как вы, возможно, знаете, поэтому не тратьте слишком много времени; просто убедитесь, что он соответствует вашим потребностям, и вы можете легко манипулировать вашей моделью через него. Создайте свою собственную черту HasCompositePrimaryKey
, для которой вы можете определить новое свойство первичного ключа: protected $primaryKey = array('key1', 'key2');
(пожалуйста, отметьте этот ответ ).
Задача 2
Действительно я также подумайте, что json
- лучший тип поля для обработки многоязыковых строковых значений. Последняя версия MySQL (8.0) внесла множество улучшений в поиск контента в JSON объектах , на которые вы, возможно, захотите взглянуть. Я бы тоже сохранил все строки в одной строке для нескольких языков, как вы делали это для своей таблицы comments
. Это позволит вам легко извлекать, отображать и легко манипулировать контентом в соответствии с выбором языка вашего пользователя или посетителя. Вы можете сохранить двухбуквенный код iso lang в пользовательском сеансе cook ie и использовать его в своем шаблоне Blade, где его будет гораздо проще использовать: $comment[$user_lang_key]
, где $user_lang_key
может быть получено из некоторого вида из Session::get('settings_lang_key')
.
Я действительно не знаю, какова цель отображения другого комментария ко «всем другим языкам», которые недоступны. Я бы предпочел использовать существующий язык в качестве запасного для моего приложения, например, engli sh, который часто используется и отображается для многих значений по умолчанию. Вам нужно просто отменить ключ lang сеанса до en
, чтобы это работало везде. Использование какого-либо «псевдонима», такого как '*'
, может сделать это немного запутанным, и, возможно, вам потребуется предварительная проверка, чтобы правильно его использовать. Если вы хотите дать своему пользователю возможность отображать комментарии в том виде, в каком он хочет, как вы сказали в комментариях, я бы предпочел сохранить это значение настроек где-нибудь в вашей базе данных и использовать его для указания на выбранный язык.
Кроме того, в случае, если вам это нужно (поскольку пользователь вашего приложения может настроить некоторые варианты поведения вашего приложения), вот как я могу обработать многоязычный параметр, который он может создать в моем приложении для электронной коммерции:
{
"fr": {
"title": "Choix d'un T-Shirt",
"fields": [
{
"label": "Taille de T-Shirt",
"type": "single-choice",
"choices": [
{ "name": "S", "price": 10 },
{ "name": "M", "price": 15 }
]
},
{
"label": "Couleur",
[...]
}
]
},
"en": {
"title": "T-Shirt Selection",
"fields": [
{
"label": "T-Shirt Size",
"type": "single-choice",
"choices": [
{ "name": "S", "price": 10 },
{ "name": "M", "price": 15 }
]
},
{
"label": "Color",
[...]
}
]
}
}
Наконец, все зависит от вас, но я хотел поделиться своими знаниями и тем, как я в настоящее время работаю на моей стороне, без каких-либо проблем с использованием многоязычных функций. Я надеюсь, что это даст вам некоторые идеи, которые лучше всего соответствуют вашим потребностям.