在学说中插入json不起作用

时间:2018-02-12 21:39:49

标签: php json symfony doctrine-orm doctrine

我调用了一个向我发送数据的JSON API,我想在Symfony中使用Doctrine将这个JSON插入到我的MariaDB数据库中。

我检索的JSON是一个对象数组,我在互联网上关注了几个例子(例如:Doctrine array vs simple_array vs json_array),但没有一个可行,我不知道我的问题是什么。

这是我的代码:

    $client = new Client();
    $request = $client->request('GET', 'mylink.com');
    $response = $request->getBody();
    $livescore = json_decode($response, true);

    $array = [];
    foreach($livescore as $value) {
        if($value['match_hometeam_name'] === 'Lyon' || $value['match_awayteam_name'] === 'Lyon') {
            $array = $value;
            break;
        }
    }

    $livescoreObj = new Livescore();
    $livescoreObj->setDateRafraichissement(new \DateTime());
    $livescoreObj->setMatch($array);

    $this->entityManager->persist($livescoreObj);
    $this->entityManager->flush($livescoreObj);

    return new JsonResponse($array);

我的实体:

    <?php

namespace SGBundle\Entity;
use Doctrine\ORM\Mapping as ORM;

/**
 * Livescore
 *
 * @ORM\Entity()
 */
class Livescore
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer", options={"unsigned":true}, nullable=false)
     *
     * @var int
     */
    private $id;

    /**
     * @ORM\Column(type="json_array", nullable=true)
     *
     * @var string
     */
    private $match;

    /**
     * @var \DateTime
     *
     * @ORM\Column(type="datetime")
     */
    private $dateRafraichissement;

    /**
     * @return mixed
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @param mixed $id
     */
    public function setId($id)
    {
        $this->id = $id;
    }

    /**
     * @return mixed
     */
    public function getMatch()
    {
        return $this->match;
    }

    /**
     * @param mixed $match
     */
    public function setMatch($match)
    {
        $this->match = $match;
    }

    /**
     * @return \DateTime
     */
    public function getDateRafraichissement()
    {
        return $this->dateRafraichissement;
    }

    /**
     * @param \DateTime $dateRafraichissement
     */
    public function setDateRafraichissement($dateRafraichissement)
    {
        $this->dateRafraichissement = $dateRafraichissement;
    }
}

我的错误:

  

SQLSTATE [42000]:语法错误或访问冲突:1064错误   'match,date_rafraichissement)附近的语法VALUES   ('{\“match_id \”:\“257194 \”,\“country_id \”:\'在第1行

提前感谢您的帮助

1 个答案:

答案 0 :(得分:4)

您的问题是$match属性:MATCH在MySQL中是reserved word,在查询中使用时需要引用。

由于原因,Doctrine不会自动引用字段。但是在构建查询时,您可以tell it to quote the field name。请尝试以下方法:

/**
 * @ORM\Column(name="`match`", type="json_array", nullable=true)
 *
 * @var string
 */
private $match;