سؤال

لقد كتبت بوابة للحصول على مجموعة النتائج من قاعدة البيانات الخاصة بي.كيف أقوم بتخزين كل صف في داو منفصل حتى أتمكن من معالجة كل سجل بشكل أكبر؟أو هل يمكنني الوصول إلى مجموعة النتائج مباشرة للحصول على السجلات؟

هذه هي بوابتي (راجع للشغل، هل يجب أن أكتب المنطق الشرطي داخل cfquery في cfc منفصل يمتد هذا؟)

<cfcomponent name="MaterialDao" hint="data access object" output="false">
 <cffunction name="init" hint="constructor" access="public" output="false" returntype="MaterialDao">
  <cfargument name="dsn" type="String" required="true" hint="datasource" />
  <cfset variables.instance.dsn = arguments.dsn />
  <cfreturn this />
 </cffunction>

 <cffunction name="readMaterial" hint="read" access="public" output="false" returntype="Query">
  <cfargument name="district" type="String" />
  <cfset var qReadMaterial = "" />
  <cfquery name="qReadMaterial" datasource="#variables.instance.dsn#">
   <cfif StructKeyExists(arguments,"district")>
   SELECT A.NR, A.BEZ, D.BES, D.STA
   <cfelse>
   SELECT A.NR, A.BEZ
   </cfif>
   FROM  DEK AS D INNER JOIN ART AS A
   ON D.NR = A.NR
   WHERE 0=0
   <cfif StructKeyExists(arguments,"district")>
    AND D.BEZ = #arguments.district#
   </cfif>
   ORDER BY A.BEZ
 </cfquery>
 <cfreturn qReadMaterial />
 </cffunction>
</cfcomponent>

لقد قرأت بالفعل الكثير من المقالات ويبدو أن هناك آراء مختلفة حول هذا الموضوع (DAO vs.البوابة، DAO والبوابة وما إلى ذلك).ما هي أفضل الممارسات، ماذا يفعل المحترفون؟

هل كانت مفيدة؟

المحلول

وإيجابيات استخدام نمط واحد فقط للطبقة الوصول إلى قاعدة البيانات. استخدام كل من DAO وبوابة هي تسمية خاطئة أنني لست متأكدا حقا حيث بدأنا، ولكن يبدو أن وجود لها إلا في الحشد كولد فيوجن. يمكن للأنماط DAO وبوابة جميلة يخدم الكثير من نفس الوظيفة، ولكن أعتقد أن DAO يلائم مشروع القانون أكثر عند الحديث عن تفاعل قاعدة البيانات.

وينبغي أن تتضمن

وظائف DAOs لأساليب CRUD بالإضافة إلى مجموعات العائدين من السجلات. منذ CRUD ومجموعات أساسية من السجلات هو تكرار للغاية، وأنا استخدم مولد رمز لإنشاء رمز لهذا التفاعل ومن ثم تخصيص ما أحتاج. هذا هو مكان جيد للمنطق مشروط لاختيار السجلات التي تحتاج إليها.

وكما ذكر هارون، والعودة مجموعة من الأشياء لمجموعة من السجلات في قاعدة البيانات الخاصة بك هو غير مجد في كولد فيوجن بسبب الحمل أداء خلق الكائنات. أنا عادة مجرد استخدام الاستعلام الأساسي عاد من DAO في وجهات نظري. ومع ذلك، إذا كان الشيء أنا النمذجة يحتاج إلى بعض السلوك في الرأي، ثم سوف أضع الاستعلام في كائن باستخدام شيء على غرار ما يفعل بيتر بيل.

نصائح أخرى

كان

وبيتر بيل عرضا كبيرا قبل بضعة أشهر على إطلاق سراحه من CFC كائن بالتكرار الأعمال الذي يسمح لك أن تأخذ سجلات متعددة وأعاد على سجل واحد في وقت واحد باستخدام هذا الإطار بسيط: <لأ href = "HTTP: // ibo.riaforge.org/ "يختلط =" نوفولو noreferrer "> http://ibo.riaforge.org/ . حتى CF هو أسرع قليلا في توليد الأجسام، إعادة تدوير مثيل واحد من كائن وإعادة إسكانها خصائص ومن المرجح أفضل أفضل ما لديكم. ولعل هذا يمكن أن تساعدك على تحميل سجل واحد في وقت واحد في DAO الخاصة بك.

والمنطق الشرطي يمكن أن يذهب في بوابة أو في CFC مدير. عادة، وأود أن تشمل المنطق التي هي بسيطة مثل المنطق المبين في رسالتك مباشرة في CFC.

وهناك القليل من النصائح، قد ترغب في جعل arguments.distinct NOT المطلوب والقيام فحص بسيط مع إذا (structKeyExists (الحجج، "متميزة")) {تفعل شيئا}.

والتحيات،

و-Aaron جرين

في شركتنا، فكرنا طويلًا وصعبًا بشأن هذه الأشياء لبضعة أشهر، وجربنا منشئ Adobe CF DAO عبر RDS وبعض البرامج الأقدم الأخرى (هل يتذكر أحد CFPowerTools؟).

قررنا في النهاية أن نكتب مولد أكواد DAO الخاص بنا واعتقدت أنني سأشارك أفكارنا هنا.السبب الذي دفعنا إلى اتخاذ هذا القرار هو أننا بحاجة إلى إضافة تلميحات القفل إلى لغة SQL، وأردنا أن نجعلها أكثر كفاءة وأكثر أمانًا ونظافة.

كان الإعداد الذي قررناه هو إنشاء كائن DAO أساسي محدد مسبقًا (يُسمى DAO.cfc) والتي تم إنشاء جميع DAOs "الجدول" الموسعة.كل ما كان يحتوي عليه هو عدد قليل من أساليب المنفعة، ولكن الشيء الرئيسي هو أنه يمكننا إضافة أي وظائف أخرى نحتاج إلى جميع المنظمات اللامركزية المستقلة التي تم إنشاؤها للوصول إليها.

لذلك نقوم بإنشاء التعليمات البرمجية تلقائيًا عن طريق تحديد جدول من قاعدة البيانات (باستخدام CF admin API) وإنشاء ملف [TableName].cfc DAO مع الحرف الأول المعتاد، والمحددات، والحروف، وبالتالي فإن الأشياء الأساسية CRUD.

بالإضافة إلى ذلك، نقوم أيضًا بإنشاء ملف [TableName]GatewayBase.cfc و أ [TableName]Gateway.cfc. [TableName]Gateway.cfc يمتد [TableName]GatewayBase.cfc.

لذلك بالنسبة لنموذج DAO الذي يتم تشغيله على جدول يسمى "العملاء"، فإن الملفات التي تم إنشاؤها هي:

Customers.cfc /* extends DAO.cfc [not created, already exists] */
CustomersGateway.cfc 
CustomersGatewayBase.cfc /* extends CustomersGateway */

لذا، الفكرة هي أن البوابة توفر طريقة للتعامل مع العديد من سجلات "العميل" - يتم استخدام DAO عند التعامل مع سجل واحد فقط.ستقوم كافة الأساليب الموجودة في البوابة بشكل عام بإرجاع كائن استعلام CF.CF غير فعال للغاية لإنشاء صفائف ضخمة من كائنات DAO، وفي أذهاننا، فإن كائن الاستعلام في CF مرن حقًا، لذلك نحن سعداء باستخدامه.

عند الترميز، الفئة الفرعية CustomerGateway.cfc هو الوحيد الذي تم إنشاء مثيل له واستخدامه.ومع ذلك، فإن الفئة الأساسية التي توسعها تحتوي على بعض الوظائف العامة المفيدة جدًا والتي تأتي مجانًا، مثل getFieldListByProperty() والتي بناءً على المعلمات التي تم تمريرها ستعيد حقولًا معينة (أيأعمدة الجدول) بواسطة خاصية معينة (أيقيمة العمود)، على سبيل المثال:

myGateway.getFieldListByProperty(property="status", value="1", fieldList="customerName,customerID", orderBy="createdOn") />

ستعيد هذه المكالمة قيمتي "customerName" و"customerID" لجميع العملاء ذوي الحالة 1، مرتبة حسب تاريخ إنشائها.يتم أيضًا تعزيز التعليمات البرمجية ضد حقن SQL والتحقق من صحتها بحيث يتم طرح الاستثناءات المعقولة.

ستوفر هذه الوظيفة 99% (نأمل!) من الاستعلام متعدد السجلات الذي تجريه على الجدول.إذا كنت بحاجة إلى استعلام أكثر تعقيدا ثم CustomerGateway.cfc هناك لتتمكن من إضافة وظائف إلى.

أخيرًا، نسمح لك بإضافة وظائف إلى CustomerGateway مركبات الكربون الكلورية فلورية فقط لأنه إذا قمت بتغيير جدول العملاء (على سبيل المثال، أضف عمودًا)، فسوف تحتاج إلى إعادة إنشاء الجدول، وسوف تقوم بالكتابة فوق Customers.cfc و ال CustomersGatewayBase.cfc.ومع ذلك، فإن الكود المخصص الخاص بك (إن وجد) آمن في الفئة الفرعية.

على أي حال، قد يكون هذا خارج الموضوع قليلاً، ولكن بالتأكيد أعتقد أن شخصًا ما قد يجد تجربتنا مفيدة.

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