Имеет разрыв при кросс-соединении с БД

  • Версия Laravel: #.#.# 8.18.1
  • Версия PHP: #.#.# 7.4
  • Драйвер базы данных и версия: MySQL 5.7.32

Описание:

Имел две модели (меню, сервис) с двумя разными базами данных, подключение задавал в модели. когда я получаю модель меню с (сервисным) отношением, она работает нормально. Но при использовании has(service) для отображения меню с сервисом Base table or view not found: 1146 Table 'common.services' doesn't exist

он будет выглядеть в моей первой базе данных

common - это имя моей первой базы данных, а службы хранятся во второй базе данных.

Действия по воспроизведению:

создать две модели в разных базах данных fetch menu с отношением has(service), чтобы получить только меню, в котором есть сервис

Предоставьте пример кода для воспроизведения ситуации/ошибки

Donkarnash 18.12.2020 20:04

не могли бы вы поделиться этим репозиторием... так что я могу видеть... я пробую все... это странная ошибка отображается только тогда, когда я использовал has()........ with() работает нормально

Usman Jdn 21.12.2020 16:55

Извините, мой плохой, вы правы, не работает для has(), но очень хорошо работает с with()

Donkarnash 22.12.2020 22:46

есть несколько других ловушек с laravel и несколькими базами данных, т.е. вы не можете создать запись в БД A, когда родительская модель находится в БД B. Laravel имеет два метода, отвечающих за оформление имени таблицы, один добавляет (тот, который используется для with( ) и подобные) добавляет имя базы данных, но второй (основной метод) добавляет только префикс имени.

Vlad Vladimir Hercules 25.12.2020 10:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
4
174
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Документация

Из Документации Laravel:

Eloquent в настоящее время не поддерживает запросы на отношения существование в базах данных. Отношения должны существовать внутри одна и та же база данных.

QueryBuilder против красноречивого

В чем причина успешного извлечения with() и неудачи has()?

QueryBuilder пересекает базы данных

with() был реализован в Illuminate\Database\Eloquent\Builder и собирает отношения в массиве $eagerLoading для загрузки с запросом.

Отношение не реализует функцию кросс-базы данных

но has() находится в черте Illuminate\Database\Eloquent\Concerns\QueriesRelationships и используется в Illuminate\Database\Eloquent\Relations\Relation вызовах getRelationWithoutConstraints(), а именно:

/**
     * Get the "has relation" base query instance.
     *
     * @param  string  $relation
     * @return \Illuminate\Database\Eloquent\Relations\Relation
     */
    protected function getRelationWithoutConstraints($relation)
    {
        return Relation::noConstraints(function () use ($relation) {
            return $this->getModel()->{$relation}();
        });
    }

как говорит PHPDoc, он просто получает экземпляр базового запроса для отношения has. это простой метод, ПРОСТО создающий простой базовый запрос на основе getModel() запроса (родительский запрос) и добавляющий его.

Решение может быть достигнуто с помощью DB::raw.

да, вы были правы... Я не читал этот КРАСНЫЙ блок, но вы также можете достичь этого Model::first()->relation()->first()....звучит глупо, но работает

Usman Jdn 23.12.2020 13:25

Другие вопросы по теме