#php #laravel #laravel-5
#php #laravel #laravel-5
Вопрос:
Как следует из названия, у меня проблемы с запросами и Laravel. По некоторым причинам к именам моих столбцов добавляется префикс «dev_» (только имена столбцов, а не таблица или что-то еще). Это, конечно, приводит к следующей ошибке, потому что столбец не имеет префикса «dev_»
Проблема возникает на сервере Ubuntu под управлением Apache и Laravel 5.0.18. Я настроил его так, чтобы он обрабатывал несколько баз данных (одна база данных для производства и одна для разработки). Вот соединения моего config/database.php
...
'default' => 'mysql',
'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'database' => storage_path().'/database.sqlite',
'prefix' => '',
],
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
],
'mysqldev' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_DEV_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
],
]
...
Производственная база данных (mysql) и база данных разработчиков (mysqldev) идентичны с точки зрения таблицы, столбца и т.д…
Я использую их в своем API через eloquent models (одна модель для prod и одна модель для разработчиков каждый раз). Я настроил префикс группы маршрутов для моего dev api, который имеет конечную точку sames в качестве prod api, но использует модели разработки.
И он отлично работает для prod API, но в dev API возникает проблема, описанная выше.
Вот мои модели,
Пользователь :
<?php namespace pgc;
use IlluminateAuthAuthenticatable;
use IlluminateDatabaseEloquentModel;
use IlluminateAuthPasswordsCanResetPassword;
use IlluminateContractsAuthAuthenticatable as AuthenticatableContract;
use IlluminateContractsAuthCanResetPassword as CanResetPasswordContract;
class User extends Model implements AuthenticatableContract, CanResetPasswordContract {
public function saves()
{
return $this->hasMany('pgcSave');
}
public function savespgc()
{
return $this->hasMany('pgcSave')->where('bya','=','0');
}
public function savesbya()
{
return $this->hasMany('pgcSave')->where('bya','=','1')->orderby('name','ASC');
}
public function screenshots()
{
return $this->hasMany('pgcScreenshot');
}
public function screenshotsbya()
{
return $this->hasMany('pgcScreenshot')->where('bya','=','1')->where('hidden','=','0');
}
public function screenshotspgc()
{
return $this->hasMany('pgcScreenshot')->where('bya','=','0')->where('hidden','=','0');
}
use Authenticatable, CanResetPassword;
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'users';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = ['user_id' , 'duid' , 'name', 'email', 'password','dealer'];
/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = ['password', 'remember_token','duid','updated_at','created_at'];
}
DevUser :
<?php namespace pgc;
use IlluminateAuthAuthenticatable;
use IlluminateDatabaseEloquentModel;
use IlluminateAuthPasswordsCanResetPassword;
use IlluminateContractsAuthAuthenticatable as AuthenticatableContract;
use IlluminateContractsAuthCanResetPassword as CanResetPasswordContract;
class DevUser extends Model implements AuthenticatableContract, CanResetPasswordContract {
public function saves()
{
return $this->hasMany('pgcDevSave');
}
public function savespgc()
{
return $this->hasMany('pgcDevSave')->where('bya','=','0');
}
public function savesbya()
{
return $this->hasMany('pgcDevSave')->where('bya','=','1')->orderby('name','ASC');
}
public function screenshots()
{
return $this->hasMany('pgcDevScreenshot');
}
public function screenshotsbya()
{
return $this->hasMany('pgcDevScreenshot')->where('bya','=','1')->where('hidden','=','0');
}
public function screenshotspgc()
{
return $this->hasMany('pgcDevScreenshot')->where('bya','=','0')->where('hidden','=','0');
}
use Authenticatable, CanResetPassword;
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'users';
protected $connection = 'mysqldev';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = ['user_id' , 'duid' , 'name', 'email', 'password','dealer'];
/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = ['password', 'remember_token','duid','updated_at','created_at'];
}
Save :
<?php namespace pgc;
use IlluminateDatabaseEloquentModel;
class Save extends Model {
public function user()
{
return $this->belongsTo('pgcUser');
}
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'saves';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = ['user_id', 'name', 'savedata'];
}
DevSave :
<?php namespace pgc;
use IlluminateDatabaseEloquentModel;
class DevSave extends Model {
public function user()
{
return $this->belongsTo('pgcDevUser');
}
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'saves';
protected $connection = 'mysqldev';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = ['user_id', 'name', 'savedata'];
}
И вот как настраивается префикс группы маршрутов разработки :
Route::group(['prefix' => 'devs'], function ()
{
...
Route::post('getpreconfig', function()
{
$bya = false;
if (!is_null(Input::get('type')))
{
if (Input::get('type') == "bya")
$bya = true;
}
$user = pgcDevUser::where('name', '=', "admin")->first();
if(is_null($user))
return ("error:user not found or logged in!");
if ($bya)
$allsaves = $user->savesbya;
else
$allsaves = $user->savespgc;
if (is_null($allsaves))
return ("empty");
//echo ($allsaves);
return $allsaves->toJson();
});
...
});
Для производственной стороны это та же функция конечной точки post, но вместо нее используется пользовательская модель. (И, как я уже сказал выше, он отлично работает на производственной стороне).
Комментарии:
1. С сервера, где это происходит, откройте,
php artisan tinker
а затемconfig('database')
. Посмотрите, установлен ли тамprefix
. Если это так, очистите кеш конфигурации с помощьюphp artisan config:clear
. Вы когда-нибудь использовали префикс намеренно?2. Там не установлен префикс, и нет, я никогда не использовал префикс намеренно.
Ответ №1:
Ваше имя модели — DevUser
, но вы используете user_id
в своей базе данных. Если вы явно не укажете столбец, используемый для отношения, Laravel попытается угадать его, откуда dev_user_id
берется. Определите ваши отношения следующим образом:
В DevSave.php
:
public function user(){
return $this->belongsTo('pgcDevUser', 'user_id');
}
Или рассмотрите возможность использования dev
в ваших именах отношений, таких как public function devUser()
и т.д.
Причина, по которой ваш код работает в рабочей среде, заключается в том, что вы используете User
, а не DevUser
, поэтому Laravel правильно угадывает, что user_id
это столбец, который вы хотите использовать в отношениях.
Комментарии:
1. Это действительно была проблема, спасибо. Поскольку я не хотел переименовывать свой столбец, я хочу использовать первое решение, а также должен был внести следующие изменения в свои функции разработчика :
public function saves() { return $this->hasMany('pgcDevSave', 'user_id'); }