Нежелательный префикс добавляется в мои имена столбцов по запросам - PullRequest
2 голосов
/ 24 апреля 2019

Как видно из названия, у меня проблемы с запросами и 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) и база данных dev (mysqldev) идентичны с точки зрения таблицы, столбца и т. Д. Я использую их в своем API через eloquent модели (одна модель для prod и одна модель для dev каждый раз) Я установил префикс группы маршрутов для моего dev api, который имеет ту же конечную точку, что и prod api, но использует модели для разработчиков. И это прекрасно работает для API prod, но на dev API возникает проблема, описанная выше. Вот мои модели, Пользователь:

<?php namespace pgc;

use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

class User extends Model implements AuthenticatableContract, CanResetPasswordContract {

    public function saves()
    {
        return $this->hasMany('pgc\Save');
    }

    public function savespgc()
    {
        return $this->hasMany('pgc\Save')->where('bya','=','0');
    }

    public function savesbya()
    {
        return $this->hasMany('pgc\Save')->where('bya','=','1')->orderby('name','ASC');
    }


    public function screenshots()
    {
        return $this->hasMany('pgc\Screenshot');
    }

    public function screenshotsbya()
    {
        return $this->hasMany('pgc\Screenshot')->where('bya','=','1')->where('hidden','=','0');
    }
    public function screenshotspgc()
    {
        return $this->hasMany('pgc\Screenshot')->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 Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

class DevUser extends Model implements AuthenticatableContract, CanResetPasswordContract {

    public function saves()
    {
        return $this->hasMany('pgc\DevSave');
    }

    public function savespgc()
    {
        return $this->hasMany('pgc\DevSave')->where('bya','=','0');
    }

    public function savesbya()
    {
        return $this->hasMany('pgc\DevSave')->where('bya','=','1')->orderby('name','ASC');
    }


    public function screenshots()
    {
        return $this->hasMany('pgc\DevScreenshot');
    }

    public function screenshotsbya()
    {
        return $this->hasMany('pgc\DevScreenshot')->where('bya','=','1')->where('hidden','=','0');
    }
    public function screenshotspgc()
    {
        return $this->hasMany('pgc\DevScreenshot')->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'];

}

Сохранить:

<?php namespace pgc;

use Illuminate\Database\Eloquent\Model;


class Save extends Model {

    public function user()
    {
        return $this->belongsTo('pgc\User');
    }

    /**
     * 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 Illuminate\Database\Eloquent\Model;


class DevSave extends Model {

    public function user()
    {
        return $this->belongsTo('pgc\DevUser');
    }

    /**
     * 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 = pgc\DevUser::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();
    });

    ...

});

Для производственной стороны это та же самая функция конечной точки, но вместо нее используется модель User. (И, как я сказал выше, он отлично работает для производственной части).

1 Ответ

2 голосов
/ 24 апреля 2019

Название вашей модели DevUser, но вы используете user_id в своей базе данных.Если вы явно не укажете столбец, используемый для отношения, Laravel попытается угадать его, откуда и взялся dev_user_id.Определите ваши отношения следующим образом:

В DevSave.php:

public function user(){
    return $this->belongsTo('pgc\DevUser', 'user_id');
}

Или рассмотрите возможность использования dev в именах ваших отношений, таких как public function devUser() и т. Д.

Причина, по которой ваш код работает в рабочей среде, заключается в том, что вы используете User, а не DevUser, поэтому Laravel правильно полагает, что user_id - это столбец, который вы хотите использовать в отношениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...