كيف الوصول إلى جداول مختلفة في قاعدة البيانات دون إنشاء كيانات في سيمفوني
-
21-12-2019 - |
سؤال
لدي جدول مع 3 أعمدة إمبلوفينوم ، جوبتيتليكود والتكلفة.لقد جعلت كيان لذلك مع وظائف الخام الأساسية.
توظيف و جوبتيتليكود على حد سواء مفاتيح خارجية وعند عرض الكيان أريد أن أكون قادرا على الاستعلام عن جدول آخر في قاعدة البيانات لاستخراج اسم الموظف من جوبيستينوم و جوبيتيتل من جوبيتيتليكود.
في سيمفوني 1.4 أنا يمكن أن تفعل فقط العقائدي:: جيتابل ('الموظفين').العثور على ('توظيف') عن طريق تحديد' الموظفين ' في المخطط ولكن لم أتمكن من العثور على أي طريقة مماثلة في سيمفوني 2.4.
من ال أبي ل جيتدوكترين () لم أجد أي أساليب مماثلة يمكنني استخدامها وإذا كنت بناء استعلام على هذا النحو:
createQuery('SELECT a FROM hs_hr_employee a WHERE a.emp_number=1')
أحصل على الخطأ أدناه
[Semantical Error] line 0, col 14 near 'hs_hr_employee': Error: Class 'hs_hr_employee' is not defined
فكيف يمكنك الوصول إلى البيانات من الجداول الأخرى في ديسيبل?
المحلول
تحاول العقيدة دائما تعيين نتائجك إلى الكيانات بشكل افتراضي.
يمكنك استخدام بيان معد دون الحاجة إلى تقديم نتيجة-رسم الخرائط:
احصل على الاتصال:
$connection = $em->getConnection();
إعداد بيان وتنفيذه:
$statement = $connection->prepare(
'SELECT a FROM hs_hr_employee a WHERE a.emp_number = :emp'
);
$statement->bindValue('emp', $emp);
$statement->execute();
// for SELECT queries
$result = $statement->fetchAll('EAGER'); // note: !== $connection->fetchAll()!
// for INSERT, UPDATE, DELETE queries
$affected_rows = $statement->rowCount();
هذا هو معبرة جدا.انظر الأمثلة أدناه للحصول على متغيرات أقصر.
البديل:
استخدام الاستعلام سكل الأصلي مع نتيجة-رسم الخرائط.
يوضح المثال المتقدم كيفية إعادة تسمية الأعمدة في مصفوفة النتائج.
// create a result-mapping
$rsm = new ResultSetMapping;
$rsm->addScalarResult('n', 'nickname');
$rsm->addScalarResult('f', 'muchachos');
$query = $em->createNativeQuery(
'
SELECT
users.name as n
COUNT(user.friends) as f
WHERE
users.name = :username_parameter
FROM
user_table_name users
',
$rsm
);
$query->setParameter('username_parameter', $username);
$result = $query->getSingleResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY);
// example: $username = 'nifr'
// array => [
// 'nickname' => 'nifr'
// 'muchachos' => 3919410
// ]
إصدارات أقصر: (السماح عقيدة إعداد بيان + جلب مباشرة نتيجة)
// for SELECT queries
$result = $connection->executeQuery(
'SELECT a FROM hs_hr_employee a WHERE a.emp_number = ?'
array($emp)
);
//for INSERT, UPDATE, DELETE queries
$affected_rows = $connection->executeUpdate(
'DELETE FROM hs_hr_employee a WHERE a.emp_number = ?',
array($emp)
);
// fetch all into array ( <numeric-index> => <associative-array-entry> )
$connection->fetchAll(
'SELECT a FROM hs_hr_employee a WHERE a.emp_number = ?',
array($emp)
);
// fetch only first-row of result-set as associative array
$connection->fetchAssoc(
'SELECT a FROM hs_hr_employee a WHERE a.emp_number = ?',
array($emp)
);
// fetch only first-row of result-set as array with numeric indexes
$connection->fetchArray(
'SELECT a FROM hs_hr_employee a WHERE a.emp_number = ?',
array($emp)
);
حتى المتغيرات الأقصر (ل من إدراج أو تحديث أو حذف الاستعلامات)
// DELETE FROM user WHERE id = ? (1)
$conn->delete('user', array('id' => 1));
// INSERT INTO user (username) VALUES (?) (nifr)
$conn->insert('user', array('username' => 'nifr'));
// UPDATE user (username) VALUES (?) WHERE id = ? (nifr, 1)
$conn->update('user', array('username' => 'nifr'), array('id' => 1));
روابط مفيدة:
- باستخدام البيان المعد
- سكل الأصلي
- بيان (واجهة) أبي دوك
- بيان (واجهة) كود