• Каким образом реализовать связь "Один к одному через" в Laravel, для нескольких (двух) баз данных?

    AgentSmith72
    @AgentSmith72 Автор вопроса
    Дмитрий,

    Возвращает null (Это из-за кэша было)
    spoiler
    public function user()
    {
        $instance = $this->newRelatedInstance(User::class);
        $foreignKey = 'requests.id';
        $localKey = 'request_id';
    
        return $this->newHasOne($instance->newQuery(), $this, $foreignKey, $localKey)->join('orders.requests', 'requests.user_id', '=', 'users.id');
    }
    
    protected function newHasOne(Builder $query, Model $parent, $foreignKey, $localKey)
    {
        return new HasOne($query, $parent, $foreignKey, $localKey);
    }

    Запрос:
    spoiler
    select * from `users` 
    inner join `orders`.`requests` 
    on `requests`.`user_id` = `users`.`id` 
    where `requests`.`id` = ?
    and `requests`.`id` is not null 
    and `users`.`deleted_at` is null
  • Каким образом реализовать связь "Один к одному через" в Laravel, для нескольких (двух) баз данных?

    AgentSmith72
    @AgentSmith72 Автор вопроса
    Дмитрий,

    Анализ запроса
    dd($this->setConnection('mysql_u')->hasOne(
            User::class,
            'id',
            'id',
            'request_id',
            'user_id')->join('orders.requests', 'requests.user_id', '=', 'users.id')->toSql());

    Результат:
    select * from `users` 
    inner join `orders`.`requests` 
    on `requests`.`user_id` = `users`.`id` 
    where `users`.`id` = ? 
    and `users`.`id` is not null 
    and `users`.`deleted_at` is null
  • Каким образом реализовать связь "Один к одному через" в Laravel, для нескольких (двух) баз данных?

    AgentSmith72
    @AgentSmith72 Автор вопроса
    Дмитрий, пробовал имя БД, null возвращает. Так только в билдере работает. (Как оказалось из-за кэша)

    Пример в builder
    DB::table('request_discussions')
            ->leftJoin('requests', 'request_discussions.request_id', '=', 'requests.id')
            ->leftjoin('orders.users','requests.user_id','=','users.id')
            ->where('request_discussions.id', '=', 23721)                       
            ->get();

    Но хочу добиться. чтобы возвращалась связь.
  • Каким образом реализовать связь "Один к одному через" в Laravel, для нескольких (двух) баз данных?

    AgentSmith72
    @AgentSmith72 Автор вопроса
    Дмитрий,

    where неверно отрабатывает
    SQLSTATE[42000]: Syntax error or access violation: 1049 Unknown database 'mysql_u'
    SELECT
      *
    FROM
      `users`
      INNER JOIN `mysql_u`.`requests` ON `requests`.`user_id` = `users`.`id`
    WHERE
      `users`.`id` = 23721
      AND `users`.`id` IS NOT NULL
      AND `users`.`deleted_at` IS NULL
    limit
      1
  • Каким образом реализовать связь "Один к одному через" в Laravel, для нескольких (двух) баз данных?

    AgentSmith72
    @AgentSmith72 Автор вопроса
    Дмитрий,

    'mysql_u.requests' таким образом laravel не видит БД. Работает через переменную:
    Запрос
    $database1 = config()->get('database.connections.mysql.database');
    
    return $this->setConnection('mysql_u')->hasOne(
            User::class,
            'id',
            'id',
            'request_id',
            'user_id')->join($database1.'.requests', 'requests.user_id', '=', 'users.id');

    Но возвращает null.
  • Каким образом реализовать связь "Один к одному через" в Laravel, для нескольких (двух) баз данных?

    AgentSmith72
    @AgentSmith72 Автор вопроса
    Дмитрий, подскажи пожалуйста, что не так с этим запросом?
    Запрос
    DB::Connection('mysql')->table('request_discussions')
                ->leftJoin('requests', 'request_discussions.request_id', '=', 'requests.id')
                ->leftjoin((DB::Connection('mysql_u')->table('users')), 'requests.user_id', '=', 'users.id')
                ->get();

    Object of class Staudenmeir\LaravelCte\Query\Builder could not be converted to string
  • Как протестировать производительность функций начинающему php-разработчику?

    AgentSmith72
    @AgentSmith72 Автор вопроса
    Vitsliputsli, дело в том что вы просто нарисовались здесь, не принеся ни байта полезной информации. Во мне ли дело или в вас пустословах?
  • Как протестировать производительность функций начинающему php-разработчику?

    AgentSmith72
    @AgentSmith72 Автор вопроса
    Vitsliputsli, ты ничего не понял.

    Тебя что головой роняли в детстве? Я спросил о подходе, а именно как люди делают, гоняют переменные или хранят в свойствах, а вы имбецилы мне тут дичь втираете про мой идеальный код.
  • Как протестировать производительность функций начинающему php-разработчику?

    AgentSmith72
    @AgentSmith72 Автор вопроса
    Vitsliputsli,

    Знакома вам функция?

    $data = getrusage();
    echo $data["ru_oublock"]; // количество операций вывода блока
    echo $data["ru_inblock"]; // количество операций приёма блока
    echo $data["ru_msgsnd"]; // количество отправленных сообщений IPC
    echo $data["ru_msgrcv"]; // количество принятых сообщений IPC
    echo $data["ru_maxrss"]; // наибольший размер установленной резидентной памяти
    echo $data["ru_ixrss"]; // суммарное значение размера разделяемой памяти
    echo $data["ru_idrss"]; // суммарное значение размера неразделяемых данных
    echo $data["ru_minflt"]; // кол. исправленных страниц (лёгкая ошибка страницы)
    echo $data["ru_majflt"]; // кол.ошибочных страниц (тяжёлая ошибка страницы)
    echo $data["ru_nsignals"]; // количество полученных сигналов
    echo $data["ru_nvcsw"]; // количество согласованных переключений контекста
    echo $data["ru_nivcsw"]; // количество несогласованных переключений контекста
    echo $data["ru_nswap"]; // количество свопов
    echo $data["ru_utime.tv_usec"]; // время на задачи пользователя (user time) (микросекунды)
    echo $data["ru_utime.tv_sec"]; // время на задачи пользователя (user time) (секунды)
    echo $data["ru_stime.tv_usec"]; // время на системные задачи (system time) (микросекунды)


    А вот создание дополнительных объектов рефлексии - это затраты как памяти, так и времени на создание объектов.

    Я так и написал..

    Речь не про оценку, а про то что по коду гораздо проще понять что вы имеете ввиду,

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

    Хотя там всё просто: Маршрутизатор анализирует URL, на основе этого создаёт нужный контроллер и отправляет маркер в родительский конструктор созданного контроллера.

    Где маркер нужен в дальнейшем для проверок условного ветвления, без необходимости хранить информацию маршрутизатора в свойствах класса.

    А вот создание дополнительных объектов рефлексии - это затраты как памяти, так и времени на создание объектов.

    Дело не в объекте рефлексии, сама рефлексия подразумевает проанализировать свой код.
    Разумеется так никто писать не будет. Это просто метафора на подход к работе с информацией из памяти.
  • Как протестировать производительность функций начинающему php-разработчику?

    AgentSmith72
    @AgentSmith72 Автор вопроса
    Спасибо, xDebug может показать узкие места.

    попробуйте функцию getrusage(), которая показывает время отработки скрипта в МС, а также затраты памяти.

    $data = getrusage();
    echo $data["ru_oublock"]; // количество операций вывода блока
    echo $data["ru_inblock"]; // количество операций приёма блока
    echo $data["ru_msgsnd"]; // количество отправленных сообщений IPC
    echo $data["ru_msgrcv"]; // количество принятых сообщений IPC
    echo $data["ru_maxrss"]; // наибольший размер установленной резидентной памяти
    echo $data["ru_ixrss"]; // суммарное значение размера разделяемой памяти
    echo $data["ru_idrss"]; // суммарное значение размера неразделяемых данных
    echo $data["ru_minflt"]; // кол. исправленных страниц (лёгкая ошибка страницы)
    echo $data["ru_majflt"]; // кол.ошибочных страниц (тяжёлая ошибка страницы)
    echo $data["ru_nsignals"]; // количество полученных сигналов
    echo $data["ru_nvcsw"]; // количество согласованных переключений контекста
    echo $data["ru_nivcsw"]; // количество несогласованных переключений контекста
    echo $data["ru_nswap"]; // количество свопов
    echo $data["ru_utime.tv_usec"]; // время на задачи пользователя (user time) (микросекунды)
    echo $data["ru_utime.tv_sec"]; // время на задачи пользователя (user time) (секунды)
    echo $data["ru_stime.tv_usec"]; // время на системные задачи (system time) (микросекунды)
  • Как протестировать производительность функций начинающему php-разработчику?

    AgentSmith72
    @AgentSmith72 Автор вопроса
    Вообще странная вещь для разработчика описывать код словами

    ..причём тут код, вопрос о разнице в подходах, измерении скорости скрипта и затрат памяти.

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

    Если вы предлагаете передачу объекта через аргумент функции заменить на создание еще одного объекта, значит вы плохо представляете, как и на что выделяется память.

    Хотите оценить мой код, изучите мои комментарии с ThunderCat, там внизу присутствует код RouteController.

    ..написали бы как и для чего выделяется память, было бы полезней намного..
  • Как протестировать производительность функций начинающему php-разработчику?

    AgentSmith72
    @AgentSmith72 Автор вопроса
    ThunderCat, ваша бурная фантазия рисует вам некого мутанта

    Дверь в здание:

    namespace application\core;
    
    class RouteController {
    
        public function __construct() {
    
            $url = trim($_SERVER['REQUEST_URI'], '/');
            $check = explode('/', $url)[0];
    
            $controller = 'main';
    
    		    if($check == 'admin' or $check == 'user') $controller = $check;
    
    		    $path = '\application\controllers\\' . ucfirst($controller) . 'Controller';
    
    		    $object = new $path($controller, $url);
        }
    }


    И по моей логике, типовой контроллер - дверь в конкретное помещение.
  • Как протестировать производительность функций начинающему php-разработчику?

    AgentSmith72
    @AgentSmith72 Автор вопроса
    ThunderCat, Вопрос был какие инструменты опытные разработчики используют, при проектировании архитектуры, чтобы эффективно расходовать системные ресурсы.

    Пока чувствовал себя Галилеем перед стариками из Ватикана, обвинявшими меня в ереси, нашёл функцию getrusage(), которая показывает мне количество памяти и потраченное на обработку логики время.
  • Как протестировать производительность функций начинающему php-разработчику?

    AgentSmith72
    @AgentSmith72 Автор вопроса
    ThunderCat, Какая другая последовательность может быть, если в адресе
    site.ru/user/Nikolai-Drozdov/edit/3/Sobaka
    при парсинге URL второй индекс либо существующий метод либо ошибка 404?

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

    Это называется полиморфизм, и занимает сиё несколько строк, но обрабатывает все возможные варианты страниц.

    Если я захочу изменить параметры

    Парсинг URL проверяет наличие контроллера, и имя метода которое идёт либо сразу после домена, либо после имени авторизованного пользователя. Другие параметры URL не связаны с логикой и могут быть любыми.

    Если вам и надо будет что-то менять, то это не отобразится на логике, так как она безупречна.
  • Как протестировать производительность функций начинающему php-разработчику?

    AgentSmith72
    @AgentSmith72 Автор вопроса
    ThunderCat,

    Это все равно что в такси привозить машины на машине, потому что мы не знаем сколько будет пассажиров,

    ошибаетесь, мы сразу из RouteController попадаем в типовой контроллер, где формируется имя нужной машины, и она вызывается объектом, созданным в конструкторе родительского контроллера типовых контроллеров.

    $method собирается как конкретная машина для конкретного типа запроса

    return $content = [
          'posts' => $this->model->$method($url)
    ];


    Просто у компани три телефона, один отвечает за грузоперевозки и резервирует соответствующую машину, а другой типовой контроллер (диспетчер) обрабатывает пассажирские перевозки, третий соответственно это секретарь администратора, и отправляет за босом вертолёт.
  • Как протестировать производительность функций начинающему php-разработчику?

    AgentSmith72
    @AgentSmith72 Автор вопроса
    ThunderCat, URL формируется в зависимости от типа пользователя, если это авторизованный пользователь, то URL принимает вид site.ru/user/Nikolai-Drozdov/office

    Таким образом, если мы здесь не находим типовой контроллер:
    ($controller == 'main')? $i = 0 : $i = 2;
    то искать метод типовой модели следует после имени авторизованного пользователя.

    Что вас смущает конкретно?
  • Как протестировать производительность функций начинающему php-разработчику?

    AgentSmith72
    @AgentSmith72 Автор вопроса
    Дмитрий, Спасибо, PSR фреймворк на основе стандартов, обязательно гляну..
  • Как протестировать производительность функций начинающему php-разработчику?

    AgentSmith72
    @AgentSmith72 Автор вопроса
    уже плохо, контроллер не должен знать что-то про урл и прочие переменные извне. Для этого есть роутер и реквест.

    Вообще-то это правило работает только касательно Модели и Вида, где они не знают друг о друге.

    Как тип контроллера соотносится с ролью пользователя?

    Так что создаётся объект к примеру AdminController, а аргументы попадают в родительский контроллер типового контроллера. Типовой контроллер формирует имя метода у типовой модели AdminModel.

    У вас же уже вызван контроллер, RouteController.php, либо он не контроллер, либо зачем тогда снова контроллер создавать? И зачем ему урл?

    ($controller == 'main')? $i = 0 : $i = 2;
    $check = 'get' . ucfirst(explode('/', $url)[$i]);  // URL нужен чтобы не хранить инфо в свойствах класса
    
    if(method_exists($this->model, $check))
    else // 404 error


    Вы удивитесь но мой MVC фреймворк создан и прекрасно работает., он намного логичнее старых версий, и вызывает гнев у опытных разработчиков, так как требует меньше задействованной памяти.

    А URL в RouteController.php нужен, так как автобусы едут прямо по карте (с) Яндекс.