Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Смотрел в сторону таких штуковин, как Deployer и Capistrano.
Большое спасибо!
Информации для размышления достаточно. Как выработаю решение, опубликую.
Большое спасибо!
Вопрос был по существующим.
Считаю, ответ получен.
Большое спасибо!
Пока что работаю один, но в одиночку я это хозяйство вряд-ли потяну, помощника думаю искать в ближайшее время, поэтому, наверное, тестовый сервер нужен наверное, сразу :-).
Мне виделось что-то вроде автодеплоя master-а на "бой"... Читал, что есть такие схемы.
Другой вопрос, в этом случае, придется каждый раз апдейтить composer...
Когда Вы говорили про накат с локального на боевой, Вы подразумевали накат vendor, или апдейт composer-а лучше выполнять на боевом?
Или версия целиком собирается на локальном и накатывается?
Миграции-то, я так понимаю, все равно запускать "на бою" придется?
Извините за такой "поток сознания", реально, опыта развертывания чего-то подобного не имею, в голове каша пока.
Хотелось бы, конечно, отладить более-менее оптимальную схему...
Доброго времени суток!
Требуется развернуть ресурс в сети, с учетом дальнейшей доработки/поддержки, контроля версий и т. п.
Кто-нибудь может подсказать примерную структуру? Ну там, тестовый-боевой-локальный..?
Не хотелось бы наступать на грабли, а чтобы сразу более-менее оптимально, по-опыту.
С уважением.
Доброго времени суток, уважаемые!
Приходит время организовать на сайте справочную систему, да и вообще, можно сказать, нечто вроде базы знаний... Ну, иерархическую структуру страниц, с прекрестными ссылками, с которой потом, по-идее, могли бы работать много людей.
Как это лучше сделать?
wiki?
А технически?
Поддомен?
Я прошу извинить, но никогда не решал подобных вопросов, хотя бы направление определить.
С уважением.
Думаю, из-за ошибки здесь, посмотрите внимательно
where table.table1_id = table1.id
Кстати, разместить тему не в том разделе, по-сути, примерно та же ошибка :-) Ваш вопрос не имеет отношения к Laravel, для подобного существует "Общий раздел" :-)
It work! То, что надо.
$competitors = Competitor::join('ratings as rs', 'rs.competitor_id', '=', 'competitors.id')
->orderBy('rs.position', 'asc')
->select('competitors.*')
->with('users')
->with('photos')
->with('ratings')
->paginate(3);
Спасибо!
Связь hasOne. Спасибо!
Доброго времени суток, уважаемые!
А можно ли в запросе вида
$competitors = Competitor::with('users')
->with('photos')
->with('ratings')
->paginate(3);
выполнить общую сортировку по одному из полей ratings?
С уважением.
А почему тогда не юзер3,юзер2,юзер4 ? :-)
Впрочем, это не суть, рейтинг, в данном случае, не итог состязания.
что только люди не придумают, лишь бы редис не использовать Androbim, попробуй так, для общего развития, представить сколько запросов будет генерировать твой метод и сколько памяти потреблять если нужно будет отранжировать, ну, хотя бы миллион записей…
Не думаю, что там когда-либо будет миллион строк, но дело не в этом, просто я про Redis не в курсе пока еще, впрочем, спасибо, обязательно посмотрю.
собственно сам момент:почему у юзер5 не 5-е место , а 3-е?
Потому что у предыдущих одинаковые оценки, тут в соответствии с постановкой, все верно. Логическая несостыковка? Хм... Как посмотреть, ведь у предыдущих - 2-е место.
В итоге вышло вот что.
public function rating()
{
// Полная очистка рейтинга
DB::table('rating_scores')->truncate();
//Подготовка данных для выстраивания рейтинга
$rows = DB::table('scores')
->select(DB::raw('competitor_id, nomination_id, avg(score) as avscore'))
->where('is_actual', '=', 1)
->groupBy('competitor_id')
->groupBy('nomination_id')
->orderBy('avscore', 'desc')
->get();
//Вставка
foreach ($rows as $row) {
DB::table('rating_scores')->insert(['competitor_id' => $row->competitor_id, 'nomination_id' => $row->nomination_id, 'avscore'
=> $row->avscore]);
}
//Построение рейтинга
//Получаем открытые номинации (чтобы не тратить ресурсы на закрытые)
$nominations = Nomination::where('is_actual', 1)->get();
// По каждой номинации считается рейтинг, используется алгоритм, предоставленный covobo
foreach ($nominations as $nomination) {
$ratings = RatingScore::where('nomination_id', $nomination->id)
->orderBy('avscore', 'desc')->get();
$position = 0;
$prev_score = 0;
foreach ($ratings as $rating) {
$rating_current = RatingScore::find($rating->id);
if ($prev_score != $rating_current->avscore) {
$position = $position + 1;
}
$rating_current->position = $position;
$prev_score = $rating_current->avscore;
$rating_current->save();
}
}
}
Ну так я весьма вами благодарен :-)
Вот так получаем позицию участника.
SET @position = 0;
SET @prev_avscore = 0;
SELECT a.* FROM (
SELECT competitor_id, avscore, if(@prev_avscore != avscore, @position := @position + 1, @position) as position, @prev_avscore := avscore
FROM rating_scores
WHERE nomination_id = 1
ORDER BY position) as a
WHERE a.competitor_id = 484;
Однако, опыты продолжаются, и вот на чем остановился.
TRUNCATE TABLE rating_scores;
INSERT INTO rating_scores (competitor_id, nomination_id, avscore)
SELECT competitor_id, nomination_id, avg(score) as avscore
FROM scores
WHERE is_actual = 1
GROUP BY competitor_id, nomination_id
ORDER BY avscore desc
SET @position = 0;
SET @prev_avscore = 0;
SELECT competitor_id, avscore, if(@prev_avscore != avscore, @position := @position + 1, @position) as position, @prev_avscore := avscore
FROM rating_scores
WHERE nomination_id = 1
ORDER BY position
В результате участники с одинаковыми оценками имеют одинаковые позиции.
'484', '6.10', '1', '6.10'
'487', '6.10', '1', '6.10'
'485', '1.50', '2', '1.50'
'486', '1.40', '3', '1.40'
Большое всем спасибо еще раз!
Решил при помощи GROUP_CONCAT, предварительно создав такую вьюху, для "уникальности" участников:
CREATE VIEW rating_scores AS SELECT
AVG(score) AS avscore, competitor_id, nomination_id
FROM scores
WHERE is_actual = 1
GROUP BY competitor_id, nomination_id'
А затем, к ней:
$ratingScores = DB::table('rating_scores')
->select(DB::raw('avscore, GROUP_CONCAT(competitor_id)'))
->where('nomination_id', $id) //параметр
->groupBy('avscore')
->orderBy('avscore', 'desc')
->get();
return $ratingScores;
Результат (в первом элементе, как раз, одинаковые оценки):
Collection {#781 ▼
#items: array:3 [▼
0 => {#782 ▼
+"avscore": 6.1
+"GROUP_CONCAT(competitor_id)": "487,484"
}
1 => {#784 ▼
+"avscore": 1.5
+"GROUP_CONCAT(competitor_id)": "485"
}
2 => {#785 ▼
+"avscore": 1.4
+"GROUP_CONCAT(competitor_id)": "486"
}
]
}
Есть особенности, но это лишь особенности:
Исключения в Laravel
В общем случае как-то так:
public function вашаФункция(StoreCommentRequest $request)
{
try {
//ваш запрос к БД
} catch (Exception $e) {
// обработка исключения, в данном случае, как-раз, редирект
redirect()->back()
->with('error', $e->getMessage());
}
}
Конечно есть, это просто обработка соответствующего исключения. В нее можно вставить и редирект.
Это, в любом случае, динамическое содержимое, поэтому хранение в БД очевидно.
Немного поработал с Yii и его Gii(генератор представлений, моделей, контроллеров с эшенами для создания, удаления, редактир-я записей), очень понравилось, и хочу такое же в Laravel.
А зачем? Для генерации классов Artisan проще, ничего лишнего...
Из вашего разговора сделал вывод, что дело еще и ресурсозатратное.
Может быть, структуру стоит изменить?
Может быть, оптимальным было бы запускать задачу по пересчету рейтинга?
Большое всем спасибо! Направление примерно понятно, пока заверстаю, подумаю :-)
Смещаем место только если изменился рейтинг.
В настоящее время рейтинг в структуре не хранится. Предполагалось вычислять его "по-ходу".
Впрочем, мне кажется, что даже если изменить структуру под Ваше решение... Не оптимально.
P.S. Сорри, подразобрался, прикину. Спасибо :-)
Решение для MySQL
А если оценки одинаковые? Место-то, при этом одно...