Ваш JSON недопустим. Look {"id": "00001",} И json_decode ($ json, false) должен быть.
рабочий раствор:
$json = '{
"result":0,
"status":[{"id":"00001"},
{"id":"00002"},
{"id":"00003"}
]
}';
$data = json_decode($json, false);
foreach ($data->status as $status){
echo $status->id;
}
У меня была аналогичная ситуация, когда я должен был предоставить интерфейс между приобретенными приложениями, которые находились в производстве и использовались множеством различных систем. В этой системе были разные имена таблиц в dev, test и prod (смешно ...) Мое решение заключалось в том, чтобы оставить заполнитель для номера таблицы в конфигурации NHibernate, например:
<class name="MyClass" table="MyTable[tableNumber]">
А затем реализовать INamingStrategy аналогично:
public class MyCustomNamingStrategy : INamingStrategy
{
public string ClassToTableName(string className)
{
return DefaultNamingStrategy.Instance.ClassToTableName(className);
}
public string PropertyToColumnName(string propertyName)
{
return DefaultNamingStrategy.Instance.PropertyToColumnName(propertyName);
}
public string TableName(string tableName)
{
tableName = tableName.Replace("[tableNumber]", LocalSettings.TableNumber);
return DefaultNamingStrategy.Instance.TableName(tableName);
}
public string ColumnName(string columnName)
{
return DefaultNamingStrategy.Instance.ColumnName(columnName);
}
public string PropertyToTableName(string className, string propertyName)
{
return DefaultNamingStrategy.Instance.PropertyToTableName(className, propertyName);
}
public string LogicalColumnName(string columnName, string propertyName)
{
return DefaultNamingStrategy.Instance.LogicalColumnName(columnName, propertyName);
}
}
Затем установите стратегию именования в конфигурации:
myConfiguration.SetNamingStrategy(new MyCustomNamingStrategy());
Таким образом, номер таблицы может быть сохранен в App.config, и приложение может перемещаться между средами, изменяя только значения в App.config. Я'
У меня была та же самая проблема, и мой подход должен был обновить значения конфигурации NHIBERNATE во времени выполнения. Таким образом я мог решить, с какой из моих многих тождественно именованных таблиц я буду говорить. Основанием техники является этот:-
private static void SetTableMapping(Configuration config,
Type persistentClass, string newTableName)
{
PersistentClass classMapping = config.GetClassMapping(persistentClass);
Table physicalTable = classMapping.RootTable;
physicalTable.Name = newTableName;
}
Искавший много, но ничто определенное было доступно, наконец ступил линию за линией throgh источник NHibernate и нашел следующее решение. Это не легко, но все еще имеет работу вокруг.
SqlInterceptor
который реализует IInterceptor
OnPrepareStatement
метод можно изменить Sql, как Вы хотитеconfiguration.SetInterceptor(new SqlInterceptor());
Следующее является кодом для SqlInterceptor
using System;
using System.Collections;
using NHibernate.SqlCommand;
using NHibernate.Type;
namespace NHibernate
{
[Serializable]
public class SqlInterceptor : IInterceptor
{
public virtual void OnDelete(object entity, object id, object[] state, string[] propertyNames, IType[] types)
{
}
public void OnCollectionRecreate(object collection, object key)
{
}
public void OnCollectionRemove(object collection, object key)
{
}
public void OnCollectionUpdate(object collection, object key)
{
}
public virtual bool OnFlushDirty(object entity, object id, object[] currentState, object[] previousState,
string[] propertyNames, IType[] types)
{
return false;
}
public virtual bool OnLoad(object entity, object id, object[] state, string[] propertyNames, IType[] types)
{
return false;
}
public virtual bool OnSave(object entity, object id, object[] state, string[] propertyNames, IType[] types)
{
return false;
}
public virtual void PostFlush(ICollection entities)
{
}
public virtual void PreFlush(ICollection entitites)
{
}
public virtual bool? IsTransient(object entity)
{
return null;
}
public virtual object Instantiate(string clazz, EntityMode entityMode, object id)
{
return null;
}
public string GetEntityName(object entity)
{
return null;
}
public object GetEntity(string entityName, object id)
{
return null;
}
public virtual int[] FindDirty(object entity, object id, object[] currentState, object[] previousState,
string[] propertyNames, IType[] types)
{
return null;
}
public virtual void AfterTransactionBegin(ITransaction tx)
{
}
public virtual void BeforeTransactionCompletion(ITransaction tx)
{
}
public virtual void AfterTransactionCompletion(ITransaction tx)
{
}
public virtual void SetSession(ISession session)
{
}
public SqlString OnPrepareStatement(SqlString sql)
{
///Do something fancy here like
///sql.Replace("_MonTranTable_", MonthName + "Tran");
return sql;
}
}
}
Святой # % $ ^!=)
Я считаю, что это может быть достигнуто с пользовательским IEntityPersister
, но это не было бы никакой легкой задачей.
Я не уверен в этом, но являюсь обновляемым представлением какой-либо справки?
Это не прямой ответ на Ваш вопрос, но возможно это может быть решение, в конце концов.
Возможно, можно ли добавить представление или два к DB, который заставит все те динамические таблицы быть похожими на тот?
Еще одна опция состоит в том, чтобы или использовать пользовательский SQL, чтобы сделать персистентность или записать sprocs для обработки постоянно меняющихся имен таблиц.