Нежелательный префикс добавлен к именам моих столбцов в запросах

#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'); }