Получение объекта таблицы (App_Model_TableName) в качестве результата выборки (Zend Framework)

Прямо сейчас я написал бы функцию в моей модели как:

public function getRowsByZipCode($zip)
{
// SQL to get all the rows with the given zip code
$stmt = $this   -> getAdapter()
-> query(  "SELECT *
FROM
table_name
WHERE
table_name.status = 1 AND
table_name.zip={$zip}");
$resultRows = $stmt->fetchAll();

// -------------------------------------------------------- //
// Convert result set to an array of objects
$resultObjects = array();
// If there is atleast one row found in DB
if(count($resultRows) > 0)
{
// Loop throguh all the rows in the resultset
foreach($resultRows as $resultRow) {
// Create table row and fill it with the details got from DB
$h = $this->createRow();
$h->setFromArray($resultRow);

// Add to the array
$resultObjects[] = $h;
}
}
return $resultObjects;
// -------------------------------------------------------- //
}

Который работает отлично, как мне было нужно. И он возвращает мне массив, содержащий объекты строк таблицы (App_Model_TableName Объекты), который будет использоваться позже для дальнейших операций, таких как сохранение и удаление и т.п.

Что я действительно хочу, так это удалить код, который перебирает строки, полученные из результирующего набора, и преобразовывать каждую строку в объект App_Model_TableName что я написал в комментариях // — //.

Заранее спасибо.

4

Решение

Во-первых, я предполагаю, что вы используете PDO.

Попробуйте следующее

class App_Model_TableName
{
public $status;
public $zip;
// public $other_column;
}

class YourClass
{
protected function getAdapter()
{
// Do adapter stuffs
}

public function query($query, array $param)
{

// When Using PDO always use prepare and execute when you pass in a variable
// This will help prevent SQL injection
$stmt = $this->getAdapter()->prepare($query);
return $query->execute($param);
}

/**
* @return App_Model_TableName[]
*/
public function getRowsByZipCode($zip)
{
// SQL to get all the rows with the given zip code
// This way will help prevent SQL injection
$query = "SELECT * FROM table_name WHERE table_name.status = 1 AND  table_name.zip = :zip";
$qData = array(':zip' => $zip);

$results = $this->query($query, $qData);

return $results->fetchAll(PDO::FETCH_CLASS, 'App_Model_TableName');
}
}

призвание YourClass::getRowsByZipCode() затем вернет вам массив App_Model_TableName объекты. Вы можете получить к ним доступ как:

$data = $instance_of_yourclass->getRowsByZipCode(12345);
foreach ($data as $row)
{
echo $row->zip;
echo $row->do_stuff();
}

Все эти удивительные функции я нашел на:

Отказ от ответственности: этот код не был проверен 🙁

Будь крутым, но оставайся теплым

2

Другие решения

Наконец, я нашел решение:

public function getRowsByZipCode($zip)
{
// SQL to get all the rows with the given zip code
$stmt = $this   -> getAdapter()
-> query(  "SELECT *
FROM
table_name
WHERE
table_name.status = 1 AND
table_name.zip={$zip}");
$resultObjects= array();
while($data = $stmt->fetch())
{
$h = $this->createRow();
$h->setFromArray($data);

// Add to array
$resultObjects[] = $h;;
}
return $resultObjects;
}

Я удалил код, который выполняет fetchAll () и перебирает каждую строку в наборе результатов. Теперь я беру каждую строку из набора результатов и создаю строку объекта App_Model_TableName, используя данные, которые мы получили из набора результатов.

Работает идеально для меня.

0

По вопросам рекламы [email protected]