These are chat archives for LaravelRUS/chat

4th
Nov 2016
seoperin
@seoperin
Nov 04 2016 00:16
@aios я смотрю на алголию в скауте (5.3) и не вижу там поиска по связям. В доках лары такого примера нет. Если брать алголию не в скауте, там есть такое?
Вот если тут в
toSearchableArray
Добавить связь типа $this->categories->toArray() это то что надо? Завтра попробую так сделать
Блин, с мобильного в гиттере очень неудобно сидеть)
jonnykey
@jonnykey
Nov 04 2016 07:50
ErrorException in AuthManager.php line 292: call_user_func_array() expects parameter 1 to be a valid callback, class 'Illuminate\Auth\SessionGuard' does not have a method 'driver'
Всем привет. Пробовал обновиться с 5.1 до 5.2 и никак не получается обходить эту ошибку. В чем может быть проблема?
JhaoDa
@jhaoda
Nov 04 2016 07:52
@jonnykey телепаты в отпуске
holikmexx
@holikmexx
Nov 04 2016 08:57
привет всем, может ли кто помочь с моим вопросом? у меня в бд в таблице user есть столбец admin, мне на сайте в нав.баре надо следать проверку: если в поле admin для юзера 1 то показать ссылку. как это осуществить?)
KarmaBot
@KarmaBot
Nov 04 2016 08:57
@holikmexx и тебе не хворать :)
Ivan
@Hunternnm
Nov 04 2016 09:00
@holikmexx может через политики сделать лучше?
holikmexx
@holikmexx
Nov 04 2016 09:00
а это как? просто laravel5 знаком недавно
Ivan
@Hunternnm
Nov 04 2016 09:00
А так @if(Auth::user()->admin ===1) link @endif
@holikmexx а как с политиками - в доке написано
holikmexx
@holikmexx
Nov 04 2016 09:20
@Hunternnm спс,показ ссылки я сделал, но вот теперь загвостка как сделать именно доступ к этой странице только админу
KarmaBot
@KarmaBot
Nov 04 2016 09:20
Спасибо (+1) для @Hunternnm принято! Текущая карма +293.
Alexander
@Dualse
Nov 04 2016 09:25
@holikmexx Может все таки почитаешь доки? Вот прям перечисли, какие пункты ты прочитал.
@Hunternnm Вот зря ты подсказал прямое решение проблемы. Сказал человеку про политики, а он проигнорировал. Полагаю, что он еще раз задал похожий вопрос в надежде, что ему также кинут готовый код и скажут куда его вставить.
Ivan
@Hunternnm
Nov 04 2016 09:31
@holikmexx почитай доки про авторизацию
Alexander
@Dualse
Nov 04 2016 09:32
@Hunternnm По идеи у него всего лишь аутефикация. Хотя я может чего не знаю.
Ivan
@Hunternnm
Nov 04 2016 09:33
@Dualse ну если есть поле admin то там есть логика какая-то
Alexander
@Dualse
Nov 04 2016 09:36
@Hunternnm Ну мне Артем объяснял так. Вот есть контроллер, если надо проверять какой метод и какому пользователю доступен, сложная логика - это авторизация. Если просто проверяется, какой контроллеру и какому пользователю относится, то это просто аутефикация. (Моя интерпретация его слов)
Вот я это так понял. Если можно разрулить ситуацию только midlleware, без политик, то это аутефикация, если уже надо в каждом методе делать проверки на права, то это авторизация.
Ivan
@Hunternnm
Nov 04 2016 09:37
@Dualse ну в любом случае ему надо читать доки...
Alexander
@Dualse
Nov 04 2016 09:37
@Hunternnm Ну это да. Я думаю, что он еще после незнакомого слова "политики" должен был пойти ее читать, а не задавать новый вопрос, на который уже дали ответ.
Anton Kazakov
@venila
Nov 04 2016 09:50
Ребят , всем привет! Такой вопрос: делаю у себя личную переписку, в итоге у меня очень много отправляется запросов в бд. 1) Получение всех входящих сообщений, 2) Получение диалогов, 3) Получение аватарки пользователя. В итоге, если будет 10 входящих, то будет 30!! запросов в бд. Я понимаю что это не норма, но как это делается по правильному? Нужно объединять таблицы, так?
Ваня Devium
@webdevium
Nov 04 2016 09:50
@venila так
Ivan
@Hunternnm
Nov 04 2016 09:51
@venila связи, не? 3 запроса итого, если не 2
JhaoDa
@jhaoda
Nov 04 2016 09:51
@venila жадную загрузку не забыл?
Anton Kazakov
@venila
Nov 04 2016 09:51
@Hunternnm не понял о чем ты. @jhaoda Аналогично, я не знаю что это)
Ivan
@Hunternnm
Nov 04 2016 09:51
@venila в доку!!!
JhaoDa
@jhaoda
Nov 04 2016 09:52
@venila так бегом доку читтаь
Anton Kazakov
@venila
Nov 04 2016 09:52
а тыкнуть сможете?)
Alexander
@Dualse
Nov 04 2016 09:52
@KarmaBot покажи дорогу в доки
Ваня Devium
@webdevium
Nov 04 2016 09:52
@venila дока по основам mysql
@venila а после доки query builder
KarmaBot
@KarmaBot
Nov 04 2016 09:52
JhaoDa
@jhaoda
Nov 04 2016 09:53
@webdevium жадная загрузка к билдеру не относится
Alexander
@Dualse
Nov 04 2016 09:55
@jhaoda Я про билдер ничего не говорил
JhaoDa
@jhaoda
Nov 04 2016 09:56
@Dualse пардоньте
Ваня Devium
@webdevium
Nov 04 2016 09:56
Пущай начнет с билдера, а дальше в связи пойдет.
jonnykey
@jonnykey
Nov 04 2016 09:59
Подскажите способ как сделать учет пользователей по активноси, пробовал этот плагин https://github.com/thomastkim/laravel-online-users, но при выходе из акк сесия из базы удаляется и не остаютс данные о последней авторизации на сайт
Oleg Melnik
@olegmelnik
Nov 04 2016 12:21
Мужики, нужно из кода вызывать SSH таски сразу на несколько серверов. Какой пакет лучше всего взять?
Anton Vorontsov
@symbios-zi
Nov 04 2016 12:37
Anton Kazakov
@venila
Nov 04 2016 12:47
Чет немного недопонимаю. У меня есть таблица сообщений, в которой лежат таблицы с id пользователей и таблица с id диалога. Как мне получить все сообщения , в которых (допустим) read = false. Это можно сделать через отношения?
Arsen Soroka
@arsen-s
Nov 04 2016 13:10
@venila все где есть FOREIGN KEY это отношение
@venila если у тебя связи хорошо прописаны в моделе - то получить релейшены не будет проблемой

@venila

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

ты имеешь ввиду поля user_id dialog_id?

projct1
@projct1
Nov 04 2016 13:22
подскажите как сразу и модифицировать коллекцию и отсеять ненужное? чтобы в одной функции всё сделать
Ваня Devium
@webdevium
Nov 04 2016 13:23
@rorc там столько методов у коллекций есть, капец просто. например ->filter()
projct1
@projct1
Nov 04 2016 13:23
@webdevium а ну хотя да, я думал фильтр не модифицирует, спс
KarmaBot
@KarmaBot
Nov 04 2016 13:23
Спасибо (+1) для @webdevium принято! Текущая карма +69.
Anton Kazakov
@venila
Nov 04 2016 13:25

@venila
У меня есть таблица сообщений, в которой лежат таблицы с id пользователей и таблица с id диалога

ты имеешь ввиду поля user_id dialog_id?
da

Arsen Soroka
@arsen-s
Nov 04 2016 13:30
@venila с чем сейчас именно трудности?
Anton Kazakov
@venila
Nov 04 2016 13:42
@arsen-s с отношениями
Arsen Soroka
@arsen-s
Nov 04 2016 13:42
@venila доку читал о них?
Anton Kazakov
@venila
Nov 04 2016 13:42
на сайте очень глупые примеры...
Arsen Soroka
@arsen-s
Nov 04 2016 13:43
все мы здесь по этим глупым примерам и разобрались с релейшенами
Anton Kazakov
@venila
Nov 04 2016 13:50
@arsen-s я тоже благодаря сайту со все разобрался, но это что-то не получается понять. Видать нужно больше времени...
@arsen-s ладно, в любом случаи спасибо тебе, пойду разбираться
Anton Kazakov
@venila
Nov 04 2016 14:04
Не , сложно, не понятно... В моделе диалогов создаю отношение belongsToMany и указываю message . В таблице с message есть столбцы с user_id + dialog_id
Что тут не так!?
мда, я кажется понял
Anton Kazakov
@venila
Nov 04 2016 15:53
Я почти со все разобрался, но... У меня есть непрочитанные сообщения и прочитанные. Информации о том, прочитано или нет сообщение лежит в бд с сообщениями. Я привязал сообщения к пользователям и диалогам через belongsTo . Пытаюсь сделать такой запрос $msg = Message::where('read', 'false')->where('recipient', Auth::user()->id)->with('dialog', 'user')->get(); , в итоге мне дают все сообщения , которые не были прочитаны, а нужно только последние сообщение. То есть, будет выводится много раз дилог, в котором много не прочитанных сообщений, а выводится должно только 1 раз
Ivan
@Hunternnm
Nov 04 2016 15:55
@venila доку прочитай хоть раз...
и поставь дебагбар и смотри запросы
так как ты написал оно тебе и вернет
Anton Kazakov
@venila
Nov 04 2016 15:55
@Hunternnm доку читал, бар стоит
@Hunternnm я знаю. Я спрашиваю, как сделать так, как я написал
Ivan
@Hunternnm
Nov 04 2016 15:56
@venila плохо читал. Читай еще раз, там всё есть
@venila ты англ версию читаешь?
Anton Kazakov
@venila
Nov 04 2016 15:57
@Hunternnm нет
Ivan
@Hunternnm
Nov 04 2016 15:58
@venila почитай еще ее
Andrei Sosnov
@atehnix
Nov 04 2016 15:58
@venila а почему ты запрашиваешь сообщения с диалогами, а не диалог с сообщениями? ;)
Ivan
@Hunternnm
Nov 04 2016 15:58
@atehnix не подсказывай
Andrei Sosnov
@atehnix
Nov 04 2016 15:59
@Hunternnm я и не подсказываю) Я просто пытаюсь понять, может у него задача такая..)
Anton Kazakov
@venila
Nov 04 2016 15:59
@atehnix потому что в сообщениях , есть dialog_id
@atehnix я не правильно мыслю?
Andrei Sosnov
@atehnix
Nov 04 2016 16:04
@venila если "есть dialog_id" - это единственная причина, то это не аргумент) Если ты хочешь диалог с сообщениями, то и запрашивай дословно Диалог::с(сообщениями). ;)
Anton Kazakov
@venila
Nov 04 2016 16:05
@atehnix , Спасибо
KarmaBot
@KarmaBot
Nov 04 2016 16:05
Спасибо (+1) для @atehnix принято! Текущая карма +160.
Anton Kazakov
@venila
Nov 04 2016 16:08
@atehnix НО. Как мне тогда еще и инфу о пользователе получить, которая лежит тоже в сообщениях.
Andrei Sosnov
@atehnix
Nov 04 2016 16:09
@venila точно так же. Подробнее - в документации, где пишут про with. )
Anton Kartsev
@bigperson
Nov 04 2016 16:12
Привет всем. Есть модель комментариев. Связь morphMany, то есть комментарии могут быть относиться к нескольким другим моделям (заказы, тикеты, и т.д.). Во вьюках используется один blade шаблон комментов и инклюдится где нужно. Для сохранения используется отдельный CommentsController который содержит единственный метод store(). Подскажите как лучше определять к какой модели надо добавить коммент? Можно использовать скрытое поле в форме с названием модели, а в методе store() определять модель, но мне кажется это не есть гуд.
Andrei Sosnov
@atehnix
Nov 04 2016 16:12
@venila хотя.. что значит "лежит тоже в сообщениях?".
Anton Kazakov
@venila
Nov 04 2016 16:13
@atehnix $r = Dialog::with('message.user')->get();
@atehnix так, тут я почти все сделал, но теперь нужно понять, как вызвать именно последние сообщение
Andrei Sosnov
@atehnix
Nov 04 2016 16:14
@venila ага, нужно. У тебя все для этого есть)
Anton Kazakov
@venila
Nov 04 2016 16:14
@atehnix мне кажется через коллекцию это можно сделать
Михаил Петров
@htmlblog
Nov 04 2016 16:39

Подскажите почему представление не цепляется к методу контроллера?
При обращении по адресу: laravel/public/article/create
выдает ошибку:
No query results for model [App\Article].

В роутере: $router->resource('article', 'ArticlesController');
Модель на которую ругается: https://thepasteb.in/p/1jhnrNoREAjFB
Контроллер: https://thepasteb.in/p/r0hwylY9Gn2uK
Пути: https://thepasteb.in/p/Wnhz1mKAzMDIV

Anton Kartsev
@bigperson
Nov 04 2016 16:41
@mikhailyand не грузят ссылки, ну судя по всему у тебя путь к модели не верный
Михаил Петров
@htmlblog
Nov 04 2016 16:43
@bigperson я харанее извиняюсь - только начал изучать.
@bigperson модель работает в других методах контроллера
@bigperson я вывожу статьи без проблем
@bigperson методы index и ArticleShow
@bigperson Модель:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Carbon\Carbon;

class Article extends Model
{
    //articles - это название таблицы в базе данных.
    protected $table='articles';


    public function scopePublished($query)//область выборки.
    {
        $query->where('created_at', '<=', Carbon::now())
            ->where('published', '=', 1);
    }
}
@bigperson Контроллер:
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Article;/* цепляем модель */
use App\Http\Requests;
use App\Http\Controllers\Controller;

class ArticlesController extends Controller
{
    public function index()//сработает на главной странице
    {
        //получаем все статьи из базы
        //$articles = Article::all();

        //получаем опубликованные статьи с датой в прошлом, использукя область выборки scopePublished в модели Article
        $articles = Article::orderBy('created_at')->published()->get(); //сортируем по дате


        //полученные данные передаем в вид
        return view('articles',['articles'=>$articles]);
    }

    public function showArticle($id) //страница просмотра статьи
    {
        //return view('articlepage');
        return view('articlepage', ['article' => Article::findOrFail($id)]);
        /*получаем данные статьи с $id и отправляем в массиве $article */
    }


    public function create()
    {
        //echo 'Добавить форму';
        return view ('articlecreate.blade.php');
    }




}
KarmaBot
@KarmaBot
Nov 04 2016 16:46
@mikhailyand, чтобы показать длинный листинг кода желательно использовать pastebin-сервис, например gist.github.com или laravel.io/bin.
Anton Kartsev
@bigperson
Nov 04 2016 16:56
@mikhailyand .blade.php убери, и да пеленку не стоит сюда такую выкладывать
Anton Kazakov
@venila
Nov 04 2016 16:57
@mikhailyand во-первых: когда вставляешь картинки , вставляй их через обратные одинарные кавычки, во-вторых, ответ дали...
Михаил Петров
@htmlblog
Nov 04 2016 16:59
@bigperson да я понял уже про стену кода
Anton Kazakov
@venila
Nov 04 2016 17:04
как вызвать scoup из другой модели?
не , не так. Как вызвать scoup + hasMany
Ivan
@Hunternnm
Nov 04 2016 17:29
@venila да прочитай ты доку! Что ж сложного то?
@venila ты задаешь вопросы, на которые ответ в доке! Не отвечают тут на них
Anton Kazakov
@venila
Nov 04 2016 17:30
@Hunternnm я уже это сделал. Правда еще вопрос появился, но я думаю мой лимит вопросов тут истрачен
Ivan
@Hunternnm
Nov 04 2016 17:30
Принципиально
Ты прочитал что можно вторым параметром передавать функцию?
Anton Kazakov
@venila
Nov 04 2016 17:31
@Hunternnm Иван, мне не нравится то, что вы не указывайте что именно я не так понимаю. Я написал другому человеку, который сказал, что именно я не дочитал , я посмотрел и понял
Ivan
@Hunternnm
Nov 04 2016 17:32
@venila а потому что доку нужно прочитать 1 раз полностью. И в голове сразу отложится где искать ответы на вопросы
В том то и дело что "не дочитал"
Anton Kazakov
@venila
Nov 04 2016 17:33
@Hunternnm я читать начал 5.0 , а там про это не слова
Ivan
@Hunternnm
Nov 04 2016 17:33
@venila эм... а какую версию пользуешь? Небось 5,3?
Anton Kazakov
@venila
Nov 04 2016 17:33
а только потом нашел больше инфы в 5.2
Ivan
@Hunternnm
Nov 04 2016 17:34
@venila смотри, ты покупаешь бмв 2016 года. Ты же не будешь читать мануал от БМВ 1990 года и искать там управление дисплеем? Там его априори быть не может
Читать доку нужно от той версии, которую ты используешь
Anton Kazakov
@venila
Nov 04 2016 17:35
Да, 5.3 , но на ларавел.су у 5.3 не все до конца переведено , поэтому привык читать более ранние версии
Ivan
@Hunternnm
Nov 04 2016 17:35
@venila оф сайт не подходит?
Anton Kazakov
@venila
Nov 04 2016 17:35
@Hunternnm а англиский не давно учит начал, еще не могу такие сложные тексты переводить.
Ivan
@Hunternnm
Nov 04 2016 17:36
@venila вот такие тексты и помогают учить язык.
Роман Сохарев
@greabock
Nov 04 2016 17:41
@venila давай подтягивай скилл по буржуйскому наречию - без него вообще никак :smile:
Anton Kartsev
@bigperson
Nov 04 2016 17:41
Подскажите по композерам. Можно ли вызывать его только при первом рендере вьюхи? Вьюха инклюдится в цикле. Получается большое количество запросов к бд.
Ivan
@Hunternnm
Nov 04 2016 17:42
@bigperson оптимизировать бы...
Нет другого варианта, только так?
Anton Kartsev
@bigperson
Nov 04 2016 17:43
@Hunternnm ну вариант вызывать его в родительской вьюхе и передавать параметры при инклюде
Ivan
@Hunternnm
Nov 04 2016 17:43
@bigperson опиши задачу
Роман Сохарев
@greabock
Nov 04 2016 17:43
@bigperson используй в композере некий сервис-синглтон, который будет подгружать/вычислять данные единожды при первом обращении, а при повторном - отдавать уже загруженные/вычислинные.
Anton Kartsev
@bigperson
Nov 04 2016 17:45
@greabock где бы пример посмотреть
Andrei Sosnov
@atehnix
Nov 04 2016 17:46
@greabock кажется у тебя в статье по упарыванию что-то такое было, если не путаю)
Роман Сохарев
@greabock
Nov 04 2016 17:53
class MyCustomServiceClass {

   protected $someData;


    public function getSomeData()
    {
        if(isset($this->someData)){

             return $this->someData;
        }

        return $this->someData = $this->calculateSomData();
    } 

    public function calculateSomData()
    {
        return DB::table('some')->get();
    }
}
class SomeServiceProvider extends ServiceProvider {

    public function register()
    {
        $this->app->singleton(MyCustomServiceClass::class);
    }

}
в коде композера:
$someData = app(MyCustomServiceClass::class)->getSomeData();
KarmaBot
@KarmaBot
Nov 04 2016 17:53
@greabock, чтобы показать длинный листинг кода желательно использовать pastebin-сервис, например gist.github.com или laravel.io/bin.
Роман Сохарев
@greabock
Nov 04 2016 17:56
@bigperson ну что, прояснилась картина?
@atehnix да, там про виджеты было
похожий случай описывался
чет потух парень... я ему вроде даже пример прям в браузере накатал =)
Anton Kartsev
@bigperson
Nov 04 2016 18:01
@greabock да, спасибо. сейчас попробую
Anton Kartsev
@bigperson
Nov 04 2016 18:16
@greabock Спасибо, все получилось
KarmaBot
@KarmaBot
Nov 04 2016 18:16
Спасибо (+1) для @greabock принято! Текущая карма +450.
Роман Сохарев
@greabock
Nov 04 2016 18:17
@bigperson :+1: Красаучег
Dmitriy
@foRsxs
Nov 04 2016 19:10
Всем добрый вечер! Подскажите как правильно запилить загрузку в шапку шаблона данных в select. То есть чтобы при любом роуте в этой вьюшке шапки загружались данные. Сейчас куча контроллеров выводит разные шаблоны но шапка одна. Не хотелось бы во всех местах вывода дописывать)) есть ли другие варианты?
KarmaBot
@KarmaBot
Nov 04 2016 19:10
@foRsxs, ну рассказывай. Как жизнь? :)
Dmitriy
@foRsxs
Nov 04 2016 19:12
в самой вьюшке тоже не хотелось городить огород. Может есть способ сделать чтобы при любом роуте подгружать эту модель
Не?
Dmitriy
@foRsxs
Nov 04 2016 19:15
@movetz щаз гляну
@movetz да что то для 1 таблицы как то слишком шикарно это делать
Max Mova
@movetz
Nov 04 2016 19:17
@foRsxs почему?
Alexander
@Dualse
Nov 04 2016 19:19
Вот вопрос про ViewComposer почти каждый день слышу
Dmitriy
@foRsxs
Nov 04 2016 19:19
@movetz здесь получится что во всех вьюшках будет подгружть
Alexander
@Dualse
Nov 04 2016 19:19
@foRsxs Пиши все в контроллере и не парься
Dmitriy
@foRsxs
Nov 04 2016 19:20
@Dualse я просто думал может есть более интересный способ
Alexander
@Dualse
Nov 04 2016 19:21
@foRsxs Ну тебе предложи более интересный и правильный способ. Тебя он не устроил.
Max Mova
@movetz
Nov 04 2016 19:24

здесь получится что во всех вьюшках будет подгружть

@foRsxs не во всех, а только там где ты его подключаешь - добавляешь в шаблон вывод композер переменной, сделай иерархию шаблонов, типо базовый -> потом тот где тебе нужен композер -> и темплейты с которыми ты работаешь

@foRsxs
Dmitriy
@foRsxs
Nov 04 2016 19:25
@movetz уже пробую
Max Mova
@movetz
Nov 04 2016 19:26

Вот вопрос про ViewComposer почти каждый день слышу

документация на фсе

А кто-то тут шарит REST хорошо?
Роман Сохарев
@greabock
Nov 04 2016 19:27
@movetz так ты вопрос задай
Max Mova
@movetz
Nov 04 2016 19:30
Внимание знатоки! Против вас играют nested forms.
Нужно сохранить большой агрегат, с множеством embedded сущностей. На фронте, есть редактор, форма с n-ми уровнями под-форм, некоторые значения интпутов завязаны на другие сущности, например теги, юзеры и т.п. и все это хозяйство сохраняется при нажатию на save - классика дизайна.
Dmitriy
@foRsxs
Nov 04 2016 19:32
вроде с рельсов
Anton Kartsev
@bigperson
Nov 04 2016 19:46
Во вьюхе в цикле инклюдится блок - другая вьюха (170 templates were rendered
). Разница в скорости 0,13-0,18 сек в пользу без инклюда (10 templates were rendered). Можно ли сохранить инклюд и при этом как-то оптимизировать?
Max Mova
@movetz
Nov 04 2016 19:55
{
   title : "Some name",
   //Еще какие-то свойства ....
   categories_id: [34, 56, 98],
    //Список мест ...для горения в аду??
    places : [
        {
            title : "Some PLACE name",
            //Еще какие-то свойства ....
            venues : [
                {
                    title: "Some VENUE name",
                    photos : [
                        //Массив фотографий
                    ],
                    cuisines : [23, 45, 67],
                    tags : [
                    //Масив тегов
                    ],
                    address : {
                      location : {lat: 0, lng: 0}, street : "Name"
                    },
                    //Или подгружаем, или создаем новое базовое место на основе этого
                    base_venue : 0,
                    price : {
                        value : 350,
                        currency : '$'
                    }
                }
            //Еще какие-то места ....
            ],
            sights : [
                 //Тоже самое что и venue
            ]
        }
        //Еще плейсы
    ],
   photos : [
      //Cсылка на уже загруженную имагу
      { id : 45, url: 'http://ddd.dev', tags : ['tagA', 'tagB']},
      //Ссылка на новую
      { is_tmp : true, tmp_id : 'df5d...' , tmp_url : 'http://tmp_ddd.dev' }
      //...
   ],
   price : {
      value : 350,
      currency : '$'
   }
};
KarmaBot
@KarmaBot
Nov 04 2016 19:55
@movetz, чтобы показать длинный листинг кода желательно использовать pastebin-сервис, например gist.github.com или laravel.io/bin.
Max Mova
@movetz
Nov 04 2016 19:57
@greabock вообщем получается что мне отправляют с фронта такой вот документ, мол это пост в блоге для путешествий с вложенным описанием мест и достопримечательностей.
одно дело сделать сохранение, пройтись по всем нодам, другое дело редактирование - где нужно сравнивать состояние всех под-документов
И да, база у меня реляционная - полный комплект в пакете
Роман Сохарев
@greabock
Nov 04 2016 20:05
@movetz печалька
под доктрину у меня есть рест-маппер, который умеет это делать
а вот под ёлку...
я даже хз
Max Mova
@movetz
Nov 04 2016 20:05
@greabock ну слава Богу у меня доктрина
Роман Сохарев
@greabock
Nov 04 2016 20:06
@movetz :+1:
окей, тогда полчасика-часик, я в пакет оформлю...
Max Mova
@movetz
Nov 04 2016 20:07
@greabock эй, погоди, так а что он делает?
в двух словах
Роман Сохарев
@greabock
Nov 04 2016 20:12
сейчас опишу, примерно...
Max Mova
@movetz
Nov 04 2016 20:13
@greabock мне кажется, что такая вложенность не совсем правильная, с точки зрения REST
Max Mova
@movetz
Nov 04 2016 20:19
может правильнее бы сделать создание таким образом:
/posts/1/places/3/venues
/posts/1/places/3/sights
/posts/1/photos
но в этом случае много запросов к серверу, проблема предусловий - когда не создан родитель, проблема транзакции - например какой-то venue не провалидируется...
Роман Сохарев
@greabock
Nov 04 2016 20:21

в общем, он умеет обрабатывать вложенные сущности.
Типа ты ему скармливаешь json/массив

$this->mapper->map(MyEntity::class,    $data);

Он по аннотациям вычислит, какие данные являются отношениями, а какие просто полями
Заполнит соответствующие поля. отношениями используя сеттеры.
Если в запросе был представлен идентификатор, то он вытащит его из базы (даже для отношений)
Если не был представлен идентификатор - то создаст новую сущность.
На выходе получаем Entity

$entity = $this->mapper->map(MyEntity::class,    $data);

остается только сделать

 $this->em->persist($entity);
 $this->em->flush();
@movetz ты на ларе работаешь? Или на симфони?
Max Mova
@movetz
Nov 04 2016 20:23
@greabock симфони, но это проблема вообще актуальна для всего
Роман Сохарев
@greabock
Nov 04 2016 20:23
Просто для лары там еще и рест-генератор есть...
Max Mova
@movetz
Nov 04 2016 20:27
@greabock используя сеттеры - эм и прощай инкапсуляция сущностей ((
ладно, сеттеры это уже другая тема.
@greabock http://labs.infyom.com/laravelgenerator/#features - это и есть рест генератор?
Роман Сохарев
@greabock
Nov 04 2016 20:32
нет, у меня он по аннотациям собирает карту реста
Блин, немного сложновато отодрать его от лары
придется покопаться чутка
Max Mova
@movetz
Nov 04 2016 20:34
@greabock а с удалением он тоже норм работает?
например если у venue удалить какую-то фотографию
Роман Сохарев
@greabock
Nov 04 2016 20:35
да
Max Mova
@movetz
Nov 04 2016 20:40
@greabock меня еще беспокоит варик того, что сейчас планируется моб приложение и мало чего дизайнеры на этот раз придумают
Роман Сохарев
@greabock
Nov 04 2016 20:51
пойду кофейку сварю... давно хотел это пакетом выложить, да вот всё повода не было
Anton Kartsev
@bigperson
Nov 04 2016 21:01
Уже спрашивал, повторюсь. Есть модель комментариев. Связь morphMany, то есть комментарии могут относиться к нескольким другим моделям (заказы, тикеты, и т.д.). Во вьюках используется один blade шаблон комментов и инклюдится где нужно. Для сохранения используется отдельный CommentsController который содержит единственный метод store(). Подскажите как лучше определять к какой модели надо добавить коммент? Можно использовать скрытое поле в форме с названием модели, а в методе store() определять модель, но мне кажется это не есть гуд.
Max Mova
@movetz
Nov 04 2016 21:05
а что передается в метод store - ?
или пока ничего?
Anton Kartsev
@bigperson
Nov 04 2016 21:23
@movetz пост данные из формы
@movetz \Illuminate\Http\Request
Max Mova
@movetz
Nov 04 2016 21:25
@bigperson я с полиморфными связями в ларе не работал, но делали проект, где сущности - посты/заказы/тикеты/ не зависли от лайков,комментов и тп и наоборот, типо как отдельные модули. Делали так - каждая сущность имеет дополнительный хэш ид - md5($this->id.'static:class' ) и имплементит интерфейс EntityContainerInterface с методом getEntityId -> возращается это хэш ид. Потом уже коммент в таблице хранит поле entity_id в котором хранится хэш ид какой-то абстрактной сущности - id, name, entity_id. Потом делается виджет - который тоже независимый и аргументом передается EntityContainerInterface сущность , ну и там все уже подгружается. На создание нового коммента отправляется этот же хэш entity_id.
в базе на entity_id вешали индекс и все прекрасно работало.
Вообщем получается минимальная связность.
Anton Kartsev
@bigperson
Nov 04 2016 21:29
@movetz спасибо, попробую разобраться, хотя что-то сложно для моего понимания.
KarmaBot
@KarmaBot
Nov 04 2016 21:29
Спасибо (+1) для @movetz принято! Текущая карма +6.
Max Mova
@movetz
Nov 04 2016 21:31
@bigperson у тебя там наверно сейчас в таблице комментов 'model_id' и 'model_name'?
Anton Kartsev
@bigperson
Nov 04 2016 21:33
@movetz commentable_id, commentable_type и user_id для привязки к автору коммента
Роман Сохарев
@greabock
Nov 04 2016 21:34

@movetz

composer require greabcok/jdnm

пробуй...

@movetz это не так делается
тебе нужно слать POST на
mysite.com/blog/posts/42/comments
ой
не тому
Max Mova
@movetz
Nov 04 2016 21:38
@greabock спасибо, попробую, но в понедельник наверное
KarmaBot
@KarmaBot
Nov 04 2016 21:38
Спасибо (+1) для @greabock принято! Текущая карма +451.
Роман Сохарев
@greabock
Nov 04 2016 21:38
@movetz лоль, ты в понедельник меня не найдешь уже
=)))
Max Mova
@movetz
Nov 04 2016 21:39
@KarmaBot 5 дней работай 2 отдыхай
Роман Сохарев
@greabock
Nov 04 2016 21:40
@bigperson
тебе нужно слать POST на
mysite.com/blog/posts/42/comments
Anton Kartsev
@bigperson
Nov 04 2016 21:40
@greabock то есть сделать отдельные роуты под каждый тип? А как в методе контроллера понять что за тип?
Max Mova
@movetz
Nov 04 2016 21:41
@bigperson у тебя получится и разные контроллеры
а там можешь трейт использовать для создания коммента
Anton Kartsev
@bigperson
Nov 04 2016 21:42
@movetz зачем мне разные? Я одним хочу, в одном методе. Меняться в нем будет лишь объект, к которому добавляется коммент
Или так лучше не делать?
Роман Сохарев
@greabock
Nov 04 2016 21:46
Route::post('/blog/posts/{id}/comments', [
    'uses' => 'CommentController@store',
    'commentable' => Post::class
])
public function store(Request $request, $id)
{
     $commentable = (new ($request->route()->getAction()['commentable']))->findOrFail($id);
     $comment = new Comment($request->all());
     $commentable->coments()->save($comment);

     return response()->json($comment, 201);
}
вот тебе
прям в браузере накатал )
Anton Kartsev
@bigperson
Nov 04 2016 21:48
@greabock спасибо добрый человек
KarmaBot
@KarmaBot
Nov 04 2016 21:48
Спасибо (+1) для @greabock принято! Текущая карма +452.
Роман Сохарев
@greabock
Nov 04 2016 21:52
я сегодня такой добрый, что аж тошнит...
Andrei Sosnov
@atehnix
Nov 04 2016 21:53
@greabock ну так праздник же, по праздникам можно)
Роман Сохарев
@greabock
Nov 04 2016 21:53
точно блин
я и забыл
Max Mova
@movetz
Nov 04 2016 22:03
@greabock genius, я про роут, правда я бы еще интерфейс добавил бы - СommentableInterface
Роман Сохарев
@greabock
Nov 04 2016 22:05
@movetz у меня рест-генератор подобным образом работает