如何更新数据库连接以进行迁移

时间:2017-04-28 10:23:32

标签: laravel

我有更新数据库配置的发布请求。我在存储中保存了一个连接的数据。在数据库配置中,我调用函数来获取它。

当数据更新时,我也会更新本地配置 config('database.connections.myconnection',$newConf)

问题在于工匠:迁移行动。在同一个请求中,我需要调用artisan:migrate,但是使用新的datbaase配置。

不幸的是,我只能将数据库字符串设置为Artisan::call('migrate',['database'=>'myconnection'])

迁移尝试使用旧的数据库数据,我收到有关数据库连接的错误。

有人知道如何为“飞行中”迁移提供新配置吗?

1 个答案:

答案 0 :(得分:0)

好吧,当你"也更新本地配置"时,你并没有真正更新它,因为你的配置是在一个文件中,配置助手不会写入文件。您只是在这里设置默认值。那就是说......

如果要保存到数据库的是连接名称(例如:' mysql'或者'默认'),那么就像发送工匠电话一样简单数据库名称,配置帮助程序检查动态名称。

public class Repository<TEntity> where TEntity : class
{
    private dynamic _context;
    private DbSet<TEntity> _dbSet;

    protected DbContext Context
    {
        get
        {
            if (_context == null)
            {
                _context = DataContextFactory.GetDataContext();
            }

            return _context;
        }
    }

    protected DbSet<TEntity> DBSet
    {
        get
        {
            if (_dbSet == null)
            {
                _dbSet = this.Context.Set<TEntity>();
            }

            return _dbSet;
        }
    }

    public virtual IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderExpression = null)
    {
        return this.GetQuery(predicate, orderExpression).AsEnumerable();
    }

    public virtual IQueryable<TEntity> GetQuery(Expression<Func<TEntity, bool>> predicate = null, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderExpression = null)
    {
        IQueryable<TEntity> qry = this.DBSet;

        if (predicate != null)
            qry = qry.Where(predicate);

        if (orderExpression != null)
            return orderExpression(qry);


        return qry;
    }

    public virtual void Insert<T>(T entity) where T : class
    {
        DbSet<T> dbSet = this.Context.Set<T>();
        dbSet.Add(entity);
    }

    public virtual void Insert(TEntity entity)
    {
        this.DBSet.Add(entity);
    }

    public virtual void Update<T>(T entity) where T : class
    {
        DbSet<T> dbSet = this.Context.Set<T>();
        dbSet.Attach(entity);
        this.Context.Entry(entity).State = EntityState.Modified;
    }

    public virtual void Update(TEntity entity)
    {
        this.Attach(entity);
        this.Context.Entry(entity).State = EntityState.Modified;
    }

    public virtual void Delete<T>(T entity) where T : class
    {
        DbSet<T> dbSet = this.Context.Set<T>();

        if (this.Context.Entry(entity).State == EntityState.Detached)
            dbSet.Attach(entity);

        dbSet.Remove(entity);

    }

    public virtual void Delete(TEntity entity)
    {
        if (this.Context.Entry(entity).State == EntityState.Detached)
            this.Attach(entity);

        this.DBSet.Remove(entity);

    }

    public virtual void Delete<T>(object[] id) where T : class
    {
        DbSet<T> dbSet = this.Context.Set<T>();
        T entity = dbSet.Find(id);
        dbSet.Attach(entity);
        dbSet.Remove(entity);

    }

    public virtual void Delete(object id)
    {
        TEntity entity = this.DBSet.Find(id);
        this.Delete(entity);
    }


    public virtual void Attach(TEntity entity)
    {
        if (this.Context.Entry(entity).State == EntityState.Detached)
            this.DBSet.Attach(entity);
    }

    public virtual void SaveChanges()
    {
        this.Context.SaveChanges();
    }
}