Я сталкиваюсь с тем, что я считаю очень простой задачей (или, по крайней мере, так должно быть), я видел много связанных вопросов и пытаюсь решить свою собственную проблему с ними, не повезло вообще, это почему я пишу свой собственный вопрос здесь.
Я хочу получить среднюю температуру из моей таблицы за последние 7 строк, то есть среднюю температуру за последние 7 дней.
Если я запрашиваю свою базу данных с помощью этого простого запроса, я получаю результат, который соответствует моим требованиям:
select avg(m.temperatura) as temperature from (SELECT temperatura from database.meteodata order by indice desc limit 7) m
Но проблема заключается в попытке переместить этот запрос в doctrine с PHP.
Я новичок в doctrine. Я строю API, используя тонкий фреймворк (версия 3). У меня есть база данных с таблицей, следующей за этой схемой:
CREATE TABLE `meteodata` (
'indice' int(11) NOT NULL AUTO_INCREMENT,
'timestamp' timestamp NULL DEFAULT NULL,
'temperatura' float DEFAULT NULL,
'humedad' float DEFAULT NULL,
'viento' float NOT NULL,
'direccion_viento' int(11) NOT NULL,
'lluvia' float NOT NULL,
'summary' varchar(100) DEFAULT NULL,
'icon' varchar(45) DEFAULT NULL,
PRIMARY KEY ('indice')
) ENGINE=InnoDB AUTO_INCREMENT=562 DEFAULT CHARSET=latin1;
У меня также есть класс сущностей для сопоставления этой таблицы с моими PHP классами, например:
use Doctrine\ORM\Mapping as ORM;
/** @ORM\Entity()
* @ORM\Table(name="meteodata")
*/
class MeteoStation implements JsonSerializable
{
/** @ORM\Id()
* @ORM\Column(name="indice", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $indice;
/** @ORM\Column(type="datetime", nullable=false) */
protected $timestamp;
/** @ORM\Column(name="viento", type="float") */
protected $wind;
/** @ORM\Column(name="temperatura", type="float") */
protected $temperature;
/** @ORM\Column(name="humedad", type="float") */
protected $humidity;
/** @ORM\Column(name="lluvia", type="float") */
protected $rain;
/** @ORM\Column(name="direccion_viento", type="integer") */
protected $dirViento;
/** @ORM\Column(length=100) */
protected $summary;
/** @ORM\Column(length=20) */
protected $icon;
/**
* @return mixed
*/
public function getIndice()
{
return $this->indice;
}
/**
* @param mixed $indice
*/
public function setIndice($indice)
{
$this->indice = $indice;
}
/**
* @return mixed
*/
public function getTimestamp()
{
return $this->timestamp;
}
/**
* @param mixed $timestamp
*/
public function setTimestamp($timestamp)
{
$this->timestamp = $timestamp;
}
/**
* @return mixed
*/
public function getWind()
{
return $this->wind;
}
/**
* @param mixed $wind
*/
public function setWind($wind)
{
$this->wind = $wind;
}
/**
* @return mixed
*/
public function getTemperature()
{
return $this->temperature;
}
/**
* @param mixed $temperature
*/
public function setTemperature($temperature)
{
$this->temperature = $temperature;
}
/**
* @return mixed
*/
public function getHumidity()
{
return $this->humidity;
}
/**
* @param mixed $humidity
*/
public function setHumidity($humidity)
{
$this->humidity = $humidity;
}
/**
* @return mixed
*/
public function getRain()
{
return $this->rain;
}
/**
* @param mixed $rain
*/
public function setRain($rain)
{
$this->rain = $rain;
}
/**
* @return mixed
*/
public function getDirViento()
{
return $this->dirViento;
}
/**
* @param mixed $dirViento
*/
public function setDirViento($dirViento)
{
$this->dirViento = $dirViento;
}
/**
* @return mixed
*/
public function getSummary()
{
return $this->summary;
}
/**
* @param mixed $summary
*/
public function setSummary($summary)
{
$this->summary = $summary;
}
/**
* @return mixed
*/
public function getIcon()
{
return $this->icon;
}
/**
* @param mixed $icon
*/
public function setIcon($icon)
{
$this->icon = $icon;
}
public function jsonSerialize()
{
return [
"index" => $this->getIndice(),
"timestamp" => $this->getTimestamp(),
"wind" => $this->getWind(),
"temperature" => $this->getTemperature(),
"humidity" => $this->getHumidity(),
"wind_direction" => $this->getDirViento(),
"rain" => $this->getRain(),
"summary" => $this->getSummary(),
"icon" => $this->getIcon()
];
}
}
Проблема здесь результат возврата всегда равен null
.
У меня есть поле хранилища с этим методом:
public function getLastAvgTemp()
{
$rsm = new ResultSetMappingBuilder($this->entityManager);
$rsm->addRootEntityFromClassMetadata('MeteoStation', 'm');
$rsm->addFieldResult('m', 'temperatura', 'temperature');
$query = $this->entityManager->createNativeQuery("select avg(m.temperatura) as temperatura from (SELECT temperatura from vinesens.meteodata order by indice desc limit 7) m", $rsm);
$data = $query->getResult();
var_dump($data);
//return $data;
}
В результате получается
nullarray(1) {
[
0
]=>
NULL
}
Я знаю, что это должно быть что-то легкое, потому что если я изменю запрос к этому (просто получение последних 7 данных) (я знаю, что это будет сделано по-другому, это просто ради вопроса)
$rsm = new ResultSetMappingBuilder($this->entityManager);
$rsm->addRootEntityFromClassMetadata('MeteoStation', 'm');
$rsm->addFieldResult('m', 'temperatura', 'temperature');
$query = $this->entityManager->createNativeQuery("select * from (SELECT * from vinesens.meteodata order by indice desc limit 7) m", $rsm);
$data = $query->getResult();
var_dump($data);
Затем он возвращает все мои значения с соответствующими данными.
Так что я думаю, что это как-то связано с выбором только одного конкретного столбца из таблицы, и я не знаю, как это исправить, потому что, если я изменю запрос на это:
$rsm = new ResultSetMappingBuilder($this->entityManager);
$rsm->addRootEntityFromClassMetadata('MeteoStation', 'm');
$rsm->addFieldResult('m', 'temperatura', 'temperature');
$query = $this->entityManager->createNativeQuery("select m.temperatura as temperatura from (SELECT temperatura from vinesens.meteodata order by indice desc limit 7) m", $rsm);
$data = $query->getResult();
var_dump($data);
Он возвращает 7 пустых объектов, например:
array(7) {
[
0
]=>
NULL
[
1
]=>
NULL
[
2
]=>
NULL
[
3
]=>
NULL
[
4
]=>
NULL
[
5
]=>
NULL
[
6
]=>
NULL
}
Пожалуйста, если вам нужна дополнительная информация, не стесняйтесь спрашивать меня.
Большое вам спасибо.