كيف يمكنني السماح بسجلات مكررة في مجموعة عقيدة

StackOverflow https://stackoverflow.com/questions/548346

  •  23-08-2019
  •  | 
  •  

سؤال

آمل أن يكون هناك بعض مستخدمي الزملاء هناك.
إليك 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, ، ولكن هذا سيقوم بالفعل بإنشاء صف آخر في قاعدة البيانات عند حفظ المجموعة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top