Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 Laravel 5.x » Ленивая загрузка без eloquent? » 26.09.2019 11:15:26

andrei24
Ответов: 1

Всем привет.

Делаю такой запрос:

$version = Version::find(1);
$version->load(['groups.products.fields', 'items.products.fields']);

Если сделать дебаг запросов, то формируется около 10 запросов и огромная выборка моделей (порядка 1-1.5к).
Продебажив, выяснили - тупит именно элоквент, из за такого количества моделей.

Собственно цель: получить эту же выборку только в виде обычного массива минуя элоквент.
Можно ли с помощью элоквента построить запросы, а затем не оборачивать результат в модели ?

#2 Re: Laravel 5.x » Запрос одним разом » 28.10.2017 15:18:22

Как-то у вас все сложно. Не совсем понятно конечная задача, но подход такой:

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']

#3 Re: Laravel 5.x » Авторизация через WG » 28.10.2017 15:05:31

Приходит верный ответ. Пример дальнейшей реализации:
Вам нужно создать в таблице 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);

#4 Laravel 5.x » Смена валюты на сайте » 19.11.2016 11:32:04

andrei24
Ответов: 0

Всем привет. Возьмем пример сайт aviasales и ему подобные.
Есть страница со списком товаров, цена показывается в usd. Товары подгружаются динамически, при достижении конца страницы грузятся следующие 20 товаров.
На странице есть селект с валютами, все валюты и курс конвертации хранятся в бд. Как сделать смену валюты без перезагрузки страницы и что бы следующие товары при скроле были в новой валюте

#5 Re: Laravel 5.x » Построить отношения » 17.11.2016 15:51:04

hzone пишет:

мужик!
пожалей глаза читателей!
оберни в bbcode [code ] !

уже нет доступа. Да и предложения по нормальному редактору уже давно обсуждалось, так и нету

#6 Re: Laravel 5.x » Построить отношения » 17.11.2016 14:02:02

hzone пишет:

Сначала покажи что есть, и что требуется (сухо без эмоций объясни).

таблица 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

#7 Re: Laravel 5.x » Построить отношения » 17.11.2016 12:12:06

hzone пишет:

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

Как вообще лучше поступать в таких ситуациях?
1) создать еще одно поле которое ведет на вторую таблицу (если добавится еще одна таблица нужно будет еще одно поле)
2) текущее решение (возникла проблема: хочу вытянуть все properties
OptionProperty::with(['property', 'property_extend'])->get();
Но проблема: если property_id есть и в properties и в property_extends то вытягивается с двух таблиц, а нужно что бы было что-то одно. Передать where в function в with не могу, так как она применяется к вытягиваемой таблице. Как быть? Сейчас сделано в 2 запроса, а потом merge коллекций)

#8 Re: Laravel 5.x » Построить отношения » 17.11.2016 09:27:41

hzone пишет:

прямо - потенциально да (надо создать такую структуру и дёрнуть её, то есть проверить)
не прямо = через переменные
$Option = Option::find(1)
$Properties = $Option->extendedProperies()
внутри метода, возвращающего  связь и надо сделать доборку ->where()->get() и возвращать коллекцию, как обычно.
сразу оговорюсь, что вызов уже будет не
$Properties = $Option->extendedProperies но $Properties = $Option->extendedProperies()

Подумал бредовая идея была, переделать. Не тот случай. Оставлю как есть

#9 Laravel 5.x » Построить отношения » 17.11.2016 07:41:57

andrei24
Ответов: 10

Всем привет. Можно ли переделать такую структуру таблиц под полиморфные связи? Что бы когда берешь у опции свойства не нужно было делать where в запросе.
Option::find(1)->properties()->where('property_type', '=', 'extend')->get();
(связь с where и скоупы в модели не предлагать, уже сделано, интересует именно morph связи)

http://savepic.net/8534958.png

#10 Laravel 5.x » Логика работы каталога товаров » 13.11.2016 12:58:32

andrei24
Ответов: 6

Всем привет. Есть каталог с товарами. Пользователи добавляют товар, модератор его подтверждает. Товар продается.
Что делать если пользователь заказывает товар, а в это время продавец поменял цену, а он уже на этапе оплаты с карты? или продавец изменил условия продажи товара (к примеру доставку с 1 дня на 10 дней) а покупателя не устраивает это, но товар уже оплачен. Или еще хуже, если в момент оплаты продавец удалил товар. Как быть в таких ситуациях ?

#11 Laravel 5.x » Response view or json » 12.11.2016 07:42:31

andrei24
Ответов: 1

Всем привет.

Есть шаблон:
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 рисуется шаблон.

Какой вариант лучше использовать ? В приоритете быстрота, удобство. Или может есть еще какой-то вариант ?

#12 Re: Laravel 5.x » Синтаксис » 30.08.2016 06:03:41

ferias пишет:

Часто вижу в Laravel синтаксис вроде "->", "=>" подскажите пожалуйста что обозначает?

Вам сюда http://php.net/manual/ru/

#13 Re: Laravel 5.x » Вопрос по работе с Eloquent » 19.08.2016 05:35:30

[quote=Валентин]Нужно объединить 2 таблицы таким образом, чтобы в первом таблице появилась колонка с массивом результатов объединения.

допустим в одном таблице пользователь со своим id, в другой контакты пользователя.

Ожидаемый результат —

users (id, name, contacts[])[/quote]
https://laravel.com/docs/5.2/queries#joins

#14 Re: Laravel 5.x » Помогите с моделькой » 19.08.2016 05:32:05

Можно обойтись и одной таблицей users. Добавьте в нее поле permissions (text) . и храните там массив где ключ это имя раздела, а значение 0 или 1. Затем создайте функцию или директиву для обработки этого массива и возвращайте bool значение

#16 Laravel 5.x » Целостность данных » 05.08.2016 12:25:57

andrei24
Ответов: 3

Всем привет.
К примеру: есть два пользователя с id:1,2 (таблица users) у каждого по 5 машин (таблица cars, с полями id, name, user_id). Первые 5 машин принадлежат 1му, вторые 5ть второму.
Затем на странице с пользователями я жму назначить 1му пользователю машину на которой обычный селект с его машинами (where user_id = 1).
В селекте с машинами я открываю редактор кода и меняю ид выбранной машины на ид 6 (машина второго пользователя) и запрос успешно проходит. Связи не нарушены. Пример базовый, но таких страниц десяток и селектов тоже. Проверять в реквесте в методе autorize все поля, это очень накладно, есть другое решение?

#17 Re: Laravel 5.x » Очень долгий request » 04.08.2016 08:29:49

Удалил все правила (10) из валидации, оставил только одно, ничего не изменилось.

8317479.png

#18 Laravel 5.x » Очень долгий request » 04.08.2016 06:49:08

andrei24
Ответов: 1

Всем привет.
Все страницы сайта отдают ответ за 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
        }
    }

#19 Laravel 5.x » Группы пользователей » 30.07.2016 12:39:19

andrei24
Ответов: 0

Всем привет. Есть ли из коробки работа с группами? Задачи такие:
Есть 1н сайт и 3 полностью разных подсайта управления сайтом: Админ, Менеджеры, Компании, Пользователи. Логин один у всех, при логине нужно определись группу пользователя и редиректнуть на site.ru/admin/ ~ meneger/ ~ company/ . При том пользователь это и есть компания, только с ограниченным доступом (Пользователя создает компания и назначает ему права доступа к разделам). Доки читал, помогите более детально построить архитектуру.

#20 Laravel 5.x » Проверка заполнен ли профиль » 18.07.2016 12:53:09

andrei24
Ответов: 1

Всем привет. Создан middleware который проверяет группу пользователя, затем берем его профиль (отдельная таблица), смотрим заполнены ли нужные мне поля, если нет то редиректим на профиль. Данные проверки добавляют 4 запроса к бд и увеличивают ответ страницы в 2 раза. Можно ли куда то вынести или как-то переделать проверку что бы она выполнялась один раз (без использования бд) ?

#21 Re: Laravel 5.x » Хранение файов » 13.07.2016 19:04:26

hzone пишет:

Короче купите сервер - на третий год в сравнении с CDN он станет выгоднее на Порядок. на 0-лик в сумме затрат.

такие масштабы пока не нужны сейчас, на ближайшие 2-3 месяца хватит 100 гб примерно. Расположение лучше всего азия

#22 Re: Laravel 5.x » Хранение файов » 13.07.2016 15:19:59

Стоит вопрос где хранить изображения ) Из расчета что их размер огромен по 5-10 мб фото и одновременно может хоть 100 пользователей загружать фото + маштабируемость и недорого

#23 Re: Laravel 5.x » Хранение файов » 13.07.2016 13:46:27

[quote=hzone]Concurrent connections 10 означает что в один квант времени 10 соединений.
Не путайте количество регистраций с активной аудиторией.
(И да, в нашем случае — квант времени растянут на время передачи контента)[/quote]

Тогда hetzner не подходит :( Может есть подобные еще? очень хороши цены.
Пока приоритет на амазон

#24 Re: Laravel 5.x » Хранение файов » 13.07.2016 12:46:59

hetzner.de

  • Storage Box 100 GB, 1 TB traffic — 3 EUR/mo
  • HTTP, FTP, SFTP, Samba, WebDAV

keyweb.ru

  • KeyDisc 100 GB = 5 EUR/mo
  • HTTP, FTP, SFTP, Samba

На выделенные часто ставят диски по 500-1000 Гб, они стоят чуть больше (от $30), но зато получаешь отдельный сервер, где скорость доступа может быть лучше и можешь настроить его как угодно.

hetzner хороший вариант — но, у них есть ограничение: Concurrent connections 10 — если у меня 500 пользователей и каждый пытается загрузить фото, это будет 1 соединение или 500 ?

#25 Re: Laravel 5.x » Хранение файов » 13.07.2016 12:37:09

hzone пишет:

cloud.google.com/storage/ 2 цента / гб в месяц.


Обычная политика такова (у большинства) - ценник за хранение и за траффик. То есть 1ГБ положить 2ц + хранить 2ц + траффик каждого 1ГБ 2ц = 6ц минимум за 1ГБ

А Вот Best Cloud Storage Providers of 2016
cloudwards()net/comparison/

Вроде у гугла правила такие что все что у них хранится является их собственностью ?

Подвал раздела