2 Вопрос: Использование Eloquent без Laravel - Невозможно использовать DB ::

вопрос создан в Thu, May 2, 2019 12:00 AM

Я пытаюсь поделиться моделями Eloquent между приложением Laravel и скриптом, который будет запускаться как задание cron.

use Illuminate\Database\Capsule\Manager as Capsule;

$Capsule = new Capsule;
$Capsule->addConnection(...);
$Capsule->setAsGlobal();
$Capsule->bootEloquent();

// Application logic below...

Используя приведенный выше код, я могу работать с моделями, если они не ссылаются на DB::. Например, для этого класса:

namespace MyApp\Modules\Locations\Models;

use DB;
use MyApp\Models\Organisation as BaseOrganisation;

class Organisation extends BaseOrganisation
{
    /**
     * The sites associated with this organisation.
     *
     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
     */
    public function sites() {
        return $this->belongsToMany(Site::class,
            DB::connection('default')->getDatabaseName() . '.global_lu_sites_organisation',
            'organisation_id',
            'site_id'
        );
    }
}

Эта модель работает в Laravel, но вызов sites() из сценария приводит к этой ошибке:

  

Неустранимая ошибка: необученная ошибка: класс 'DB' не найден в ... /app /Modules /Locations /Models /Organisation.php в строке 14

Если я изменю use DB; в модели на use Illuminate\Database\Capsule\Manager as DB;, то это будет работать на уровне сценария, но не в Laravel.

Как я могу использовать DB:: как в Laravel, так и в скрипте?

    
0
  1. Итак, чтобы уточнить, хотите ли вы связать модели, которые находятся в разных базах данных?
    2019-05-02 14: 57: 09Z
  2. Я не думаю, что это возможно без начальной загрузки всего экземпляра laravel, потому что DB - это фасад, управляемый laravel во время выполнения
    2019-05-02 14: 58: 10Z
  3. @ hdifen, да, это уже работает.
    2019-05-02 14: 59: 17Z
  4. @ gbalduzzi, как бы я сделал что-то подобное?
    2019-05-02 14: 59: 37Z
  5. Вы можете либо добавить поддержку фасадов в свое приложение, либо вам придется создать класс с именем DB в глобальном пространстве. В этом классе вы можете расширить Illuminate\Database\Capsule\Manager.
    2019-05-02 15: 24: 24Z
2 ответа                              2                         

заменить use DB; на use Illuminate\Support\Facades\DB;

    
0
2019-05-02 15: 21: 38Z
  1. Это дает мне RuntimeException: A facade root has not been set.
    2019-05-02 15: 41: 33Z
  2. Как насчет \Illuminate\Database\Connection
    2019-05-03 07: 31: 09Z

Согласно комментарию KFoobar, добавление class DB extends Illuminate\Database\Capsule\Manager {} в глобальное пространство имен устранило проблему. Я думаю, что это работает, потому что Capsule Manager сильно зависит от статических классов.

    
0
2019-05-03 00: 56: 21Z
  1. Пожалуйста, пометьте ответ как принятый . Это показывает другим пользователям, что проблема решена.
    2019-05-09 22: 33: 07Z
источник размещен Вот