These are chat archives for LaravelRUS/chat

2nd
Apr 2017
des1roer
@des1roer
Apr 02 2017 10:20
а че axios такой кусок г-на? чтобы пост получить надо $array = json_decode(file_get_contents('php://input'), true); писать
Kirill Nesmeyanov
@SerafimArts
Apr 02 2017 10:22
@des1roer ты чатом не ошибся? =))))
Dave
@aios
Apr 02 2017 10:23
@SerafimArts вот с языка снял)
des1roer
@des1roer
Apr 02 2017 10:23
ну лара+вуе любовь на век насколько понимаю
Kirill Nesmeyanov
@SerafimArts
Apr 02 2017 10:57
@des1roer ты видишь в заголовке "вуэ" и "любовь"? +)
JhaoDa
@jhaoda
Apr 02 2017 11:29
@des1roer тебе уже явно намекали, что здесь вопросы по ларавел и только по ларавел. Ты не понимаешь?
Vladimir Stempel
@dark-s
Apr 02 2017 11:42
Вы прям такие принципиальные?
JhaoDa
@jhaoda
Apr 02 2017 11:44
@dark-s для вопросов не по ларавел есть https://gitter.im/LaravelRUS/offtop
Vladimir Stempel
@dark-s
Apr 02 2017 11:45
Ну подсказать же можно, вы дольше спорить будете
Rahim
@happyhaha
Apr 02 2017 11:53

Привет. Прошу совета и помощи. Заранее огромное спасибо!
Вопрос про контейнеры.
класс Cart зависит от классов реализующие CalculatorInterface(калькулятор скидок)
конструктор Cart'a

public function __construct(StorageInterface $storage, CalculatorInterface $calculator)
    {
        $this->storage = $storage;
        $this->calculator = $calculator;
    }

Я вывел подсчет скидок в отдельную "запчасть".
Это позволило мне создавать подсчет стоимости товаров в корзине, плюс добавлять любые скидки.
Вот интерфейс

interface CalculatorInterface
{
    public function getCost(array $items);
}

Вот самый главный - базоый счетчик смоимости товаров

class SimpleCost implements CalculatorInterface
{
    public function getCost(array $items) 
    {
        $cost = 0;
        foreach ($items as $item) {
            $cost += $item->getCost();
        }

        return $cost;
    }
}

А вот скидка на основе этого интерфейса(под новогоднюю скидку):

class NewYearCost implements CalculatorInterface
{
    private $next;    
    private $month;
    private $percent;

    public function __construct(CalculatorInterface $next ,int $month, int $percent)
    {
        $this->next = $next;
        $this->month = $month;
        $this->percent = $percent;
    }
    //скашиваем количество процентов $this->percent
    public function getCost(array $items)
    {
        $cost = $this->next->getCost($items);
        if ($this->month == 12) {
            return ( 1 - $this->percent / 100 ) * $cost;
        }
        else
        {
            return $cost;
        }
    }
}

В итоге, 10 таких классов(калькуляторов), можно вкладывать друг в друга, которые считают от суммы предыдущего калькулятора.

Вопрос:
Явно передавать зависимости не хочу, как можно реализовать это в контейнере?

$this->app->bind(
    'App\Components\Cart\Calculator\CalculatorInterface',
    'App\Components\Cart\Calculator\NewYearCost'
);

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

KarmaBot
@KarmaBot
Apr 02 2017 11:53
Прувет, @happyhaha!
@happyhaha, в этом чате принято добавлять имя пользователя, чтобы его поблагодарить.
Дмитрий Мязин
@d4c0
Apr 02 2017 11:58
@happyhaha указывай в конструкторе тип конкретной реализации и всё. Тут смысл в чём, бинд по интерфейсу нужен для того, что-бы можно было безболезненно изменить реализацию компонента во всём приложении, т.н. DI. А тебе интерфейс нужен не для этого, у тебя как я понял он просто гарантирует одинаковое API всех твоих реализаций, но используешь ты одновременно не только одну из реализаций, а множество (ты говорил про вложенность).
JhaoDa
@jhaoda
Apr 02 2017 12:03
@happyhaha ну очевидно же, что никак
Значит, надо сделать Главного Счетовода и ему передать все эти скидки, пусть считает
Дмитрий Мязин
@d4c0
Apr 02 2017 12:05
А я бы вообще скидки хранил в базе. Ведь они могут постоянно изменяться (сезонные, акции, дисконты), или ты каждый раз будешь писать очередную реализацию для новой скидки?
JhaoDa
@jhaoda
Apr 02 2017 12:07
@d4c0 реализацию в любом случае писать надо. В БД же могут храниться только параметры для это реализации
Дмитрий Мязин
@d4c0
Apr 02 2017 12:10
@jhaoda ну я к тому, что был бы, как ты сказал ГлавныйСчетовод, который бы принимал модельку покупаемого товара, смотрел какие скидки к нему привязаны, и соответственно обсчитывал бы, и возвращал цену с учётом скидок)
Rahim
@happyhaha
Apr 02 2017 12:10
$storage = new SessionStorage(); //будем хранить в сессии
$simpleCalculator = new SimpleCost(); //общий подсчет стоимости всех товаров
$newYearCalculator = new NewYearCalculator( $simpleCalculator, 12, 5 ); 
$dummyCalculator = new DummyCalculator($newYearCalculator); //и так можно до бесконечности, подсчитывать стоимость 

//в итоге
$cart = new Cart( $storage, $dummyCalculator );

$cart->getCost(); //выводит стоимость всех товаров на основе всех скидок(калькуляторов)
Как можно организовать такую вложенность, чтобы не передавать их "явно"
JhaoDa
@jhaoda
Apr 02 2017 12:11
@happyhaha а зачем вложенность? Чем плох простой конвейер? Берешь ларавелевкий пайплайн и вперёд
Rahim
@happyhaha
Apr 02 2017 12:12
@d4c0 для каждого случая, буду по очередно писать...займет от силы пару минут...
@jhaoda упс, сейчас разберусь, благодарю за наводку.
@d4c0 хотя да...идеально сделать это для админки, чтобы менеджер сам мог вбивать количество процентов для скидки и другие параметры
Nickolas Che
@nickoche_twitter
Apr 02 2017 12:15

Всем привет!
Подскажите, пожалуйста. Есть таблица table с полями id, title, parent_id.

id     title     parent_id
1       rec1    0
2       rec2    1

Как получить title родительской таблицы для id=2?

JhaoDa
@jhaoda
Apr 02 2017 12:15
@happyhaha мы так и делаем. Написаны несколько вариантов скидок — по времени, по категории товаров, по пользователю и прочее. Они регаются в некоем калькуляторе-реестре и набиваются данными, которые берутся из БД (или конфига, или чего угодно)
Rahim
@happyhaha
Apr 02 2017 12:16
@d4c0 спасибо за разъяснение..ты прав, в данном случае у меня просто гарантирует определенное API
KarmaBot
@KarmaBot
Apr 02 2017 12:16
Спасибо (+1) для @d4c0 принято! Текущая карма +13.
JhaoDa
@jhaoda
Apr 02 2017 12:17
@nickoche_twitter почитать про связи и создать их
Rahim
@happyhaha
Apr 02 2017 12:18
@jhaoda Спасибо, а в итоге каждая скидка так и будет паравозиком подсчитывать скидки от общей суммы?
KarmaBot
@KarmaBot
Apr 02 2017 12:18
Спасибо (+1) для @jhaoda принято! Текущая карма +1483.
JhaoDa
@jhaoda
Apr 02 2017 12:18
@happyhaha а это как хочешь. У нас, например, из всей цепочки выбирается максимальная и уже она применяется
Nickolas Che
@nickoche_twitter
Apr 02 2017 12:20
@jhaoda прежде, чем спрашивать, я читал и сейчас здесь: https://laravel.ru/docs/v5/eloquent-relationships
JhaoDa
@jhaoda
Apr 02 2017 12:20
@nickoche_twitter ага, и чо?
@nickoche_twitter и лучше читать вот тут — https://new.laravel.su/docs/5.2/eloquent-relationships
Nickolas Che
@nickoche_twitter
Apr 02 2017 12:22
@jhaoda туплю, вот и спрашиваю!
JhaoDa
@jhaoda
Apr 02 2017 12:23
@nickoche_twitter в чем именно тупишь?
Krada88
@Krada88
Apr 02 2017 12:26
Всем привет. Есть тут кто может помочь с Redis + Socket.io в личку? Буду признателен.
KarmaBot
@KarmaBot
Apr 02 2017 12:26
@Krada88, привет, как настроение?
JhaoDa
@jhaoda
Apr 02 2017 12:27
@Krada88 спроси в https://gitter.im/LaravelRUS/offtop
Nickolas Che
@nickoche_twitter
Apr 02 2017 12:27

Как создать отношения внутри таблицы. Например, для класса User надо что-то подобное прописать:

public function parent(){
    return $this->hasOne('User');
}

?

JhaoDa
@jhaoda
Apr 02 2017 12:29
@nickoche_twitter верно мыслишь, только это Parent → hasOne → child, а тебе надо обратно. А обратно от hasOne это какая связь?
Nickolas Che
@nickoche_twitter
Apr 02 2017 12:29
@jhaoda belongsTo видимо )
JhaoDa
@jhaoda
Apr 02 2017 12:30
@nickoche_twitter ну вот, не сложно же?
Nickolas Che
@nickoche_twitter
Apr 02 2017 12:30
надеюсь )
@jhaoda благодарю
KarmaBot
@KarmaBot
Apr 02 2017 12:30
Спасибо (+1) для @jhaoda принято! Текущая карма +1484.
Anton Shelestov
@shelestovas
Apr 02 2017 14:55

Народ подскажите пожалуйста
Составил запрос(вот его часть):

                                ->leftJoin(
                                    \DB::table('games_team_infos as gti')
                                        ->select([
                                            'team_id',
                                            \DB::raw('COUNT(game_id) as count_games')
                                        ])
                                        ->whereIn('game_id', function($q) use ($tournament){
                                            $q->from('games')
                                                ->select('id')
                                                ->where('model_id', $tournament->id)
                                                ->whereNotNull('wins')
                                                ->get()
                                                ->toArray();
                                        })
                                        ->groupBy('team_id')
                                        ->get() . ' as gti',
                                    function($join){
                                        $join->on('gti.team_id', 'championships_teams.team_id');
                                })

В результате генерируется в
http://joxi.ru/a2XZDZ1I1KlPYr
И выдается ошибка SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters
Как я сделал так вообще можно делать?)