كيف يمكنني السماح بسجلات مكررة في مجموعة عقيدة
سؤال
آمل أن يكون هناك بعض مستخدمي الزملاء هناك.
إليك YAML مبسطة علاقاتي:
Collection:
columns:
id: { type: integer(4), notnull: true, primary: true, autoincrement: true }
name: { type: string(255), notnull: true, unique: true }
relations:
Items:
class: Item
refClass: CollectionItem
foreignAlias: Collections
type: many
foreignType: many
Item:
columns:
id: { type: integer(4), notnull: true, primary: true, autoincrement: true }
name: { type: string(255), notnull: true }
CollectionItem:
columns:
id: { type: integer(4), notnull: true, primary: true, autoincrement: true }
collection_id: { type: integer(4) }
item_id: { type: integer(4) }
relations:
Collection:
foreignAlias: CollectionItem
foreignType: one
Item:
foreignAlias: CollectionItem
foreignType: one
أريد أن تكون مجموعة قادرا على إجراء العديد من نسخ من نفس العنصر، ولكن عندما أستخدم الفئات التي تم إنشاؤها لتحميل عناصر مثل ذلك:
$collection = Doctrine::getTable('Collection')->find(1);
$items = $collection->Items;
لا تحتوي البنود $ على التكرارات الخاصة بي. يبدو أن SQL الذي تم إنشاؤه بإرجاع صفوف مكررة بشكل صحيح:
SELECT i.id AS i__id, i.name AS i__name, c.id AS c__id, c.collection_id AS c__collection_id, c.item_id AS c__item_id, FROM item i LEFT JOIN collection_item c ON i.id = c.item_id WHERE c.collection_id IN (?) - (1)
أعلم أنني أستطيع الدخول حول هذا الاستدعاءات الخاصة بي محددة DQL بدلا من ذلك، لكن أي شخص يعرف ما إذا كان هناك إعداد بسيط في مكان ما للسماح بمجموعة العناصر أن يكون لديك تكرارات؟
المحلول
يجب عليك تغيير وضع الترطيب إلى Hydrate_scalar:
يوفر وضع الترطيب هذا مجموعة نتيجة مسطحة / مستطيلة يمكن أن تحتوي على بيانات مكررة.
$res = $q->execute(array(), Doctrine::HYDRATE_SCALAR);
(أو إلى Hydrate_none)
كما جاء في http://www.doctrine-project.org/documentation/manual/1_1/EN/Working-With-Models#Fetching-Data.
نصائح أخرى
هل جربت:
foreach($collection->Items as $item)
{
// do something with $item
}
إذا كنت أتذكر بشكل صحيح $ Collection-> العناصر ليست صفيف حقيقي، فهو كائن ينفذ ArrayAccess / Arrayiterator
في مذهب لا يمكنك الحصول على كائنات مكررة. يتم تخزين كل كائن تم استرداده من قاعدة البيانات مرة واحدة فقط في العقيدة. إذا قمت بالاستعلام عن نفس الكائن مرتين، فستحصل على مؤشر نفس الكائن الذي استعادته بالفعل.
يمكنك استنساخ الكائن وتخزينه في Doctrine_Collection
, ، ولكن هذا سيقوم بالفعل بإنشاء صف آخر في قاعدة البيانات عند حفظ المجموعة.