Для 1 клиента это n-заказов с n-продуктами в каждом. Отношения n-n появятся в общем обзоре, где это будет когда-либо Заказчик n-n Заказ n-n Product. В любом случае, каждый разработчик ждал перекрестной ссылки в записях таблицы, а не создания вложенного объекта типа MyRecord.
Я сталкиваюсь с проблемой разработки приложений сExt.data.Model
класс в ExtJS. Я постараюсь развить свои идеи до очень распространенного сценария интернет-магазина, чтобы вы могли следовать за мной. Буду очень признателен за любые комментарии по поводу моих мыслей и выводов!
Предположим, вы хотите отобразить тот факт, что "Каждый клиент может заказать несколько продуктов«ExtJS. Из самых простых слов можно выделить эти три модели:Customer
, Order
, а такжеProduct
,Order
в этом случае то, что соединяетCustomer
с иProduct
s.
Я обнаружил, что ExtJS на самом деле позволяет вам указать это(Customer)1-n(Order)1-n(Product)
отношение с помощьюExt.data.HasManyAssociation
а такжеExt.data.BelongsToAssociation
классы. Но это то, что вы хотите? Хотели бы вы, чтобыProduct
всегда принадлежитOrder
? Что делать, если вы хотите иметь списокProduct
без какой-либо связи сOrder
что бы то ни было?
Вот где он более специфичен для ExtJS. В ExtJS у вас естьExt.data.Store
s для хранения всех ваших данных. Для меня естественный способ организовать мои данные - это иметьExt.data.Store
для каждой из моих моделей:
CustomerStore
OrderStore
ProductStore
Рассмотрим триExt.grid.Panel
s бок о бок; по одному на каждый магазин. При выборе клиента в одной сетке его заказы автоматически отображаются во второй сетке. При выборе заказа во второй сетке соответствующие товары появляются в третьей сетке.
Это звучит нормально для вас? Если нет, пожалуйста, прокомментируйте!
Объединяя все это вместеИтак, теперь у нас есть три вещи, которые нам нужно объединить:
Модели и ихАссоциации (hasMany
, belongsTo
) иДанные (Store
s)Можно ли определить ассоциацию только с одной стороны отношения Модель-Модель? Например, могу ли я указать, чтоOrder
hasMany
Product
но не учтите, чтоProduct
belongsTo
Order
? Потому чтоProduct
на самом деле может принадлежать более чем одномуOrder
, Поэтому я указываю, чтоProduct
модельhasMany
Order
ниже.
Вот модели в ExtJS:
ПокупательExt.define('Customer', {
extend : 'Ext.data.Model',
requires : [
'Order',
],
fields : [
{name : 'id', type : 'int'},
{name : 'lastname', type : 'string'}
{name : 'firstname', type : 'string'}
],
hasMany: 'Order' /* Generates a orders() method on every Customer instance */
});
порядокExt.define('Order', {
extend : 'Ext.data.Model',
fields : [
{name : 'id', type : 'int'},
{name : 'customer_id', type : 'int'}, /* refers to the customer that this order belongs to*/
{name : 'date', type : 'date'}
],
belongsTo: 'Customer', /* Generates a getCustomer method on every Order instance */
hasMany: 'Product' /* Generates a products() method on every Order instance */
});
ПродуктExt.define('Product', {
extend : 'Ext.data.Model',
fields : [
{name : 'id', type : 'int'},
{name : 'name', type : 'string'},
{name : 'description', type : 'string'},
{name : 'price', type : 'float'}
],
/*
I don't specify the relation to the "Order" model here
because it simply doesn't belong here.
Will it still work?
*/
hasMany: 'Order'
});
А вот и магазины:
CustomerStoreExt.define('CustomerStore', {
extend : 'Ext.data.Store',
storeId : 'CustomerStore',
model : 'Customer',
proxy : {
type : 'ajax',
url : 'data/customers.json',
reader : {
type : 'json',
root : 'items',
totalProperty : 'total'
}
}
});
OrderStoreExt.define('OrderStore', {
extend : 'Ext.data.Store',
storeId : 'OrderStore',
model : 'Order',
proxy : {
type : 'ajax',
url : 'data/orders.json',
reader : {
type : 'json',
root : 'items',
totalProperty : 'total'
}
}
});
ProductStoreExt.define('ProductStore', {
extend : 'Ext.data.Store',
storeId : 'ProductStore',
model : 'Product',
proxy : {
type : 'ajax',
url : 'data/products.json',
reader : {
type : 'json',
root : 'items',
totalProperty : 'total'
}
}
});
Вот пример (не мной) с компаниями и их продуктамиhttp://superdit.com/2011/05/23/extjs-load-grid-from-another-grid/ , Он использует две модели и два магазина, но нет никаких ассоциаций определения.
заранее спасибо
-Konrad