Как вставить данные в другую схему, отличную от общедоступной схемы в базе данных. [LARAVEL]

#php #database #laravel #eloquent #migration

#php #База данных #laravel #красноречивый #миграция

Вопрос:

Я хочу вставить данные в схему, которую я создал в laravel migration, но я не смог найти способ.

Кто-нибудь может подсказать, пожалуйста?

 public function up()
{
    DB::statement('CREATE SCHEMA IF NOT EXISTS reports');

    Schema::create('reports.campaign_reports', function (Blueprint $table) 
     {
        $table->bigIncrements('id');
        $table->string('campaign')->nullable();
        $table->string('currency')->nullable();
    });
}
  

Это моя модель:

 class CampaignReport extends Model
{

//    protected $connection = 'schema.reports';

protected $table = 'campaign_reports';

protected $fillable = [
    'campaign',
    'currency'
    ];
}
  

И вот как я сохраняю:

 CampaignReport::create((array) $dataObject);
  

Я получаю эту ошибку:

SQLSTATE[42P01]: Неопределенная таблица: ОШИБКА 7: отношение «campaign_reports» не существует СТРОКА 1: вставить в «campaign_reports» («кампания», «валюта»,…

введите описание изображения здесь

Комментарии:

1. вы хотите сохранить данные вручную или вводимые пользователем?

2. Я нажимаю на Google ads api и он возвращает мне данные. Я не работаю с формами или пользовательскими вводимыми данными. Просто хочу сохранить данные, поступающие из этого запроса. это работало, когда я был в общедоступной схеме (по умолчанию), но теперь я хочу сохранить в другой схеме.

Ответ №1:

Попробуйте определить второе подключение к базе данных в конфигурации вашей базы данных:

 /** config/database.php */

// ...

  'connections' => [

        'public_schema' => [
            'driver' => 'pgsql',
            'database' => env('DB_DATABASE'),
            // ...
            'schema' => 'public',
        ],

        'reports_shema' => [
            'driver' => 'pgsql',
            'database' => env('DB_DATABASE'),
            // ...
            'schema' => 'reports',
        ],
    ],

// ...
  

Затем установите соединение в вашей модели (это полезно для выполнения операций Eloquent / Query Builder):

 class CampaignReport extends Model
{

    protected $connection = 'reports_schema'; // <----

    protected $table = 'campaign_reports';

    protected $fillable = [
            'campaign',
            'currency'
        ];

    // ...
}
  

Конечно, когда вы выполняете миграцию, которую необходимо запустить в другом соединении, отличном от стандартного, вы должны указать это:

 public function up()
{
    DB::statement('CREATE SCHEMA IF NOT EXISTS reports');

    Schema::connection('reports_schema')->create('campaign_reports', function (Blueprint $t)
#           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
     {
        $t->bigIncrements('id');
        $t->string('campaign')->nullable();
        $t->string('currency')->nullable();
    });
}
  

Кстати, обновите свой .env ключ базы данных по умолчанию до этого:

 DB_CONNECTION=public_schema
  

Комментарии:

1. но тогда что я должен указать в своем файле env? прямо сейчас это DB_CONNECTION = pgsql

2. Это потому, что Laravel требуется подключение по умолчанию для использования всякий раз, когда оно не указано. В вашей миграции вы выполняли, если использовали соединение по умолчанию, которое использует public схему, я думаю, что именно здесь возникает ошибка.

3. Кстати, в вашем .env : DB_CONNECTION = public_schema'

4. Ну, я добавил вещи в database.php и миграции, и модель, но я получил эту ошибку: InvalidArgumentException : Database [reports_schema] not configured.

5. @Mohsin имена баз данных должны быть одинаковыми, вот почему я использовал EVN('DB_DATABASE') в обоих