Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Всем привет.
Делаю такой запрос:
$version = Version::find(1);
$version->load(['groups.products.fields', 'items.products.fields']);
Если сделать дебаг запросов, то формируется около 10 запросов и огромная выборка моделей (порядка 1-1.5к).
Продебажив, выяснили - тупит именно элоквент, из за такого количества моделей.
Собственно цель: получить эту же выборку только в виде обычного массива минуя элоквент.
Можно ли с помощью элоквента построить запросы, а затем не оборачивать результат в модели ?
Как-то у вас все сложно. Не совсем понятно конечная задача, но подход такой:
1. Создайте 2 модели HomeItem, HomeItemTranslate
2. Создайте в них связи: В модели HomeItem:
public function translations() {
return $this->hasMany(HomeItemTranslate::class);
}
В HomeItemTranslate:
public function homeItem() {
return $this->belongsTo(HomeItem::class);
}
4. В контроллере делайте выборку: $homeItem = HomeItem::with('translations')->find(1). Если нужно изменить респонс, используйте к примеру Laravel API Resources, fractal или написать класс в который трансформирует в нужный вам ответ.
Если вам нужно сохранить тогда: $homeItem = HomeItem::find(1); $hoteItem->translations()->create(array $translations).
Предположу что translations нужно постоянно отдавать, поэтому в модели можно сделать $with = ['translations']
Приходит верный ответ. Пример дальнейшей реализации:
Вам нужно создать в таблице users - provider (string) - хранится тип соц.сети, provider_id (int) - ид аккаунта соц.сети (1111111 у вас).
Затем должен быть роут на колбек.
Route::get('auth/{driver}/callback', 'AuthController@callback');
AuthController::callback - примерно:
$user = Socialite::driver(WargamingDriver::class)->user();
$findUser = User::where('provider_id', $user->getId())->where('provider', 'wargaming')->first();
if ($findUser) {
return auth()->login($findUser);
}
$newUser = $this->register([
'email' => $user->getEmail(),
'password' => str_random(32),
'provider' => request()->route('driver'),
'provider_id' => $user->id
]);
return auth()->login($newUser);
Всем привет. Возьмем пример сайт aviasales и ему подобные.
Есть страница со списком товаров, цена показывается в usd. Товары подгружаются динамически, при достижении конца страницы грузятся следующие 20 товаров.
На странице есть селект с валютами, все валюты и курс конвертации хранятся в бд. Как сделать смену валюты без перезагрузки страницы и что бы следующие товары при скроле были в новой валюте
мужик!
пожалей глаза читателей!
оберни в bbcode [code ] !
уже нет доступа. Да и предложения по нормальному редактору уже давно обсуждалось, так и нету
Сначала покажи что есть, и что требуется (сухо без эмоций объясни).
таблица option_properties (id, property_id, property_type)
class OptionProperty extend Model{
function properties() {
return $this->belongsTo(Property::class, 'property_id');
}
function extendProperties()
{
return $this->belongsTo(ExtendProperty::class, 'property_id');
}
}
данные в option_properties:
id|property_id|property_type ( 1 - properties, 2 - extend_properties )
1 | 1 | 1
данные в properties
id|value
1 | 1
данные в extend_properties
id|value
1 | 1
Делаю запрос:
OptionProperty::with(['properties', 'extendProperties'])->get();
Приходит модель с 2мя отношениями, но extendProperties не должно приходить, так как property_type = 1
почему же бредовая? вполне живая модель поведения.
как раз вписывается в идеологию использования того, что уже есть, вменсто клонирования алгоритма в соседний метод и генерации тонны переменных, кои сделают то же самое, но при этом пожрут память.
Как вообще лучше поступать в таких ситуациях?
1) создать еще одно поле которое ведет на вторую таблицу (если добавится еще одна таблица нужно будет еще одно поле)
2) текущее решение (возникла проблема: хочу вытянуть все properties
OptionProperty::with(['property', 'property_extend'])->get();
Но проблема: если property_id есть и в properties и в property_extends то вытягивается с двух таблиц, а нужно что бы было что-то одно. Передать where в function в with не могу, так как она применяется к вытягиваемой таблице. Как быть? Сейчас сделано в 2 запроса, а потом merge коллекций)
прямо - потенциально да (надо создать такую структуру и дёрнуть её, то есть проверить)
не прямо = через переменные
$Option = Option::find(1)
$Properties = $Option->extendedProperies()
внутри метода, возвращающего связь и надо сделать доборку ->where()->get() и возвращать коллекцию, как обычно.
сразу оговорюсь, что вызов уже будет не
$Properties = $Option->extendedProperies но $Properties = $Option->extendedProperies()
Подумал бредовая идея была, переделать. Не тот случай. Оставлю как есть
Всем привет. Можно ли переделать такую структуру таблиц под полиморфные связи? Что бы когда берешь у опции свойства не нужно было делать where в запросе.
Option::find(1)->properties()->where('property_type', '=', 'extend')->get();
(связь с where и скоупы в модели не предлагать, уже сделано, интересует именно morph связи)
Всем привет. Есть каталог с товарами. Пользователи добавляют товар, модератор его подтверждает. Товар продается.
Что делать если пользователь заказывает товар, а в это время продавец поменял цену, а он уже на этапе оплаты с карты? или продавец изменил условия продажи товара (к примеру доставку с 1 дня на 10 дней) а покупателя не устраивает это, но товар уже оплачен. Или еще хуже, если в момент оплаты продавец удалил товар. Как быть в таких ситуациях ?
Всем привет.
Есть шаблон:
index.blade.php
<button id="click">Click</button>
<div id="contentClick"></div>
contentClick.blade.php
@foreach($lists as $list)
<li>{{ $list->name }}
@endforeach
При нажатии на кнопку click идет аякс, который вызывает функцию:
function contentClick()
{
$lists = Lists::all();
return view('contentClick', compact('lists'));
}
и затем делается $('#contentClick').append(response);
То есть отдается уже готовый шаблон. Посмотрев крупные сайты, поизучав их запросы, у них всегда отдаются только данные в json. А затем на js рисуется шаблон.
Какой вариант лучше использовать ? В приоритете быстрота, удобство. Или может есть еще какой-то вариант ?
Часто вижу в Laravel синтаксис вроде "->", "=>" подскажите пожалуйста что обозначает?
Вам сюда http://php.net/manual/ru/
Всем привет.
К примеру: есть два пользователя с id:1,2 (таблица users) у каждого по 5 машин (таблица cars, с полями id, name, user_id). Первые 5 машин принадлежат 1му, вторые 5ть второму.
Затем на странице с пользователями я жму назначить 1му пользователю машину на которой обычный селект с его машинами (where user_id = 1).
В селекте с машинами я открываю редактор кода и меняю ид выбранной машины на ид 6 (машина второго пользователя) и запрос успешно проходит. Связи не нарушены. Пример базовый, но таких страниц десяток и селектов тоже. Проверять в реквесте в методе autorize все поля, это очень накладно, есть другое решение?
Удалил все правила (10) из валидации, оставил только одно, ничего не изменилось.
Всем привет.
Все страницы сайта отдают ответ за 150-200 мс. Но когда захожу в любой раздел где нужно что то создать и данные из формы проходят через валидацию, тогда время ответа сервера ну очень долгое 1.5 - 2.5 секунды, при этом это дев сервер на нем никто не сидит. (на локальном сервере все моментально, сервер на digitalocean 1гб, загрузка всех ресурсов не более 40%)
Обработчик ошибок сделан на jquery. То есть - навешено событие на сабмит формы и затем отсылаем аякс, получаем 422 ответ с массивом ошибок и выводим его.
error :function( jqXhr ) {
if( jqXhr.status === 401 ) //redirect if not authenticated user.
$( location ).prop( 'pathname', 'auth/login' );
if( jqXhr.status === 422 ) {
//process validation errors here.
$errors = jqXhr.responseJSON; //this will get the errors response data.
//show them somewhere in the markup
//e.g
errorsHtml = '<div class="alert alert-danger"><ul>';
$.each( data, function( key, value ) {
errorsHtml += '<li>' + value[0] + '</li>'; //showing only the first error.
});
errorsHtml += '</ul></di>';
$( '#form-errors' ).html( errorsHtml ); //appending to a <div id="form-errors"></div> inside form
} else {
/// do some thing else
}
}
Всем привет. Есть ли из коробки работа с группами? Задачи такие:
Есть 1н сайт и 3 полностью разных подсайта управления сайтом: Админ, Менеджеры, Компании, Пользователи. Логин один у всех, при логине нужно определись группу пользователя и редиректнуть на site.ru/admin/ ~ meneger/ ~ company/ . При том пользователь это и есть компания, только с ограниченным доступом (Пользователя создает компания и назначает ему права доступа к разделам). Доки читал, помогите более детально построить архитектуру.
Всем привет. Создан middleware который проверяет группу пользователя, затем берем его профиль (отдельная таблица), смотрим заполнены ли нужные мне поля, если нет то редиректим на профиль. Данные проверки добавляют 4 запроса к бд и увеличивают ответ страницы в 2 раза. Можно ли куда то вынести или как-то переделать проверку что бы она выполнялась один раз (без использования бд) ?
Короче купите сервер - на третий год в сравнении с CDN он станет выгоднее на Порядок. на 0-лик в сумме затрат.
такие масштабы пока не нужны сейчас, на ближайшие 2-3 месяца хватит 100 гб примерно. Расположение лучше всего азия
[quote=hzone]Concurrent connections 10 означает что в один квант времени 10 соединений.
Не путайте количество регистраций с активной аудиторией.
(И да, в нашем случае — квант времени растянут на время передачи контента)[/quote]
Тогда hetzner не подходит Может есть подобные еще? очень хороши цены.
Пока приоритет на амазон
- Storage Box 100 GB, 1 TB traffic — 3 EUR/mo
- HTTP, FTP, SFTP, Samba, WebDAV
- KeyDisc 100 GB = 5 EUR/mo
- HTTP, FTP, SFTP, Samba
На выделенные часто ставят диски по 500-1000 Гб, они стоят чуть больше (от $30), но зато получаешь отдельный сервер, где скорость доступа может быть лучше и можешь настроить его как угодно.
hetzner хороший вариант — но, у них есть ограничение: Concurrent connections 10 — если у меня 500 пользователей и каждый пытается загрузить фото, это будет 1 соединение или 500 ?
cloud.google.com/storage/ 2 цента / гб в месяц.
Обычная политика такова (у большинства) - ценник за хранение и за траффик. То есть 1ГБ положить 2ц + хранить 2ц + траффик каждого 1ГБ 2ц = 6ц минимум за 1ГБ
А Вот Best Cloud Storage Providers of 2016
cloudwards()net/comparison/
Вроде у гугла правила такие что все что у них хранится является их собственностью ?