#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')
в обоих