Поле запроса c со значением doctrine возвращает массив объектов null - PullRequest
0 голосов
/ 17 апреля 2020

Я сталкиваюсь с тем, что я считаю очень простой задачей (или, по крайней мере, так должно быть), я видел много связанных вопросов и пытаюсь решить свою собственную проблему с ними, не повезло вообще, это почему я пишу свой собственный вопрос здесь.

Я хочу получить среднюю температуру из моей таблицы за последние 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
}

Пожалуйста, если вам нужна дополнительная информация, не стесняйтесь спрашивать меня.

Большое вам спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...