如何在Symfony中访问数据库中的不同表格,而无需创建实体。

3
我有一张包含3列EmployeeNum、JobTitleCode和cost的表格。我已经为此创建了一个实体,具有基本的CRUD功能。EmployeeNum和JobTitleCode都是外键,在显示实体时,我想能够查询数据库中的另一个表格,以从EmployeeNum提取EmployeeName,从JobTitleCode提取JobTitle。
在Symfony 1.4中,我可以通过在模式中定义“Employees”,然后执行Doctrine_Core :: getTable('Employees')。find('EmployeeNum')来完成这个操作,但是在Symfony 2.4中我没有找到类似的方法。
从getDoctrine()的API中,我没有找到可以使用的类似方法,如果我构建如下的查询:
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

那么如何从数据库中的其他表中访问数据呢?

1个回答

3

Doctrine默认始终尝试将结果映射到实体。

您可以使用预处理语句而无需提供结果映射:

获取连接:

$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();

这很表达性。请看下面的示例以获取更短的变体。

替代方案:

使用带有结果映射的本地SQL查询

高级示例展示了如何重命名结果数组中的列。

// 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
// ]

较短的版本: (使用 doctrine 准备语句 + 直接获取结果)

// 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)
);

更短的变量用于INSERT、UPDATE或DELETE查询

// 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));

有用的链接:


辉煌。谢谢 - zm455

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接