2017-09-02 5 views
0

私はPHPフレームワークSymfony 3.3とORM Doctrineを使ってウェブサイトを開発しています。多くの人が永続しない

私はユーザーがおり、各ユーザーはサービスを提供できます。サービスは、複数のユーザーによるオファーです。

ユーザーのサービスリストを保持したい場合を除いて、すべてうまくいっています。何も起こらず、何の誤りもありません。私のコードで間違っているものは見えますか?

私のMySQLユーザー表:

CREATE TABLE `user` (
`id_user` INT(11) NOT NULL AUTO_INCREMENT, 
`firstname` VARCHAR(255) NOT NULL, 
`surname` VARCHAR(255) NOT NULL, 
`address` VARCHAR(255) NOT NULL, 
`zip` VARCHAR(4) NOT NULL, 
`city` VARCHAR(255) NOT NULL, 
`phone_number` VARCHAR(12) NULL DEFAULT NULL, 
`mobile_number` VARCHAR(12) NULL DEFAULT NULL, 
`email` VARCHAR(255) NOT NULL, 
`password` VARCHAR(255) NOT NULL, 
`birth_date` DATE NOT NULL, 
`is_verified` TINYINT(4) NULL DEFAULT NULL, 
`id_gender` INT(11) NOT NULL, 
PRIMARY KEY (`id_user`), 
UNIQUE INDEX `e-mail_UNIQUE` (`email`), 
UNIQUE INDEX `id_utilisateur_UNIQUE` (`id_user`), 
INDEX `fk_id_gender_idx` (`id_gender`), 
CONSTRAINT `fk_id_gender` FOREIGN KEY (`id_gender`) REFERENCES `gender`   (`id_gender`) 
) 

私のMySQL service_offerテーブル:

CREATE TABLE `service_offer` (
`id_service_offer` INT(11) NOT NULL AUTO_INCREMENT, 
`id_user` INT(11) NOT NULL, 
`id_service` INT(11) NOT NULL, 
PRIMARY KEY (`id_service_offer`), 
UNIQUE INDEX `id_user_UNIQUE` (`id_user`), 
INDEX `fk_service_idx` (`id_service`), 
CONSTRAINT `fk_service` FOREIGN KEY (`id_service`) REFERENCES `service` (`id_service`), 
CONSTRAINT `fk_user` FOREIGN KEY (`id_user`) REFERENCES `user` (`id_user`) 
) 

私のMySQLサービステーブル:

CREATE TABLE `service` (
`id_service` INT(11) NOT NULL AUTO_INCREMENT, 
`name` VARCHAR(255) NOT NULL, 
`description` VARCHAR(255) NULL DEFAULT NULL, 
PRIMARY KEY (`id_service`), 
UNIQUE INDEX `id_service_UNIQUE` (`id_service`) 
) 

私のユーザエンティティの一部:

/** 
* @var integer 
* 
* @ORM\Column(name="id_user", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="IDENTITY") 
*/ 
private $idUser; 

/** 
* 
* @ORM\ManyToMany(targetEntity="Service") 
* @ORM\JoinTable(name="service_offer", 
*  joinColumns={@ORM\JoinColumn(name="id_user", referencedColumnName="id_user")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="id_service", referencedColumnName="id_service")} 
*  ) 
*/ 
private $services; 

function getServices() { 
    return $this->services; 
} 

function setServices($services) { 
    $this->services = $services; 
    return $this; 
} 

マイサービスエンティティクラス:

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* Service 
* 
* @ORM\Table(name="service", uniqueConstraints={@ORM\UniqueConstraint(name="id_service_UNIQUE", columns={"id_service"})}, indexes={@ORM\Index(name="fk_user_idx", columns={"user"})}) 
* @ORM\Entity 
*/ 
class Service 
{ 
/** 
* @var string 
* 
* @ORM\Column(name="name", type="string", length=255, nullable=false) 
*/ 
private $name; 

/** 
* @var string 
* 
* @ORM\Column(name="description", type="string", length=255, nullable=true) 
*/ 
private $description; 

/** 
* @var integer 
* 
* @ORM\Column(name="id_service", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="IDENTITY") 
*/ 
private $idService; 



/** 
* Set name 
* 
* @param string $name 
* 
* @return Service 
*/ 
public function setName($name) 
{ 
    $this->name = $name; 

    return $this; 
} 

/** 
* Get name 
* 
* @return string 
*/ 
public function getName() 
{ 
    return $this->name; 
} 

/** 
* Set description 
* 
* @param string $description 
* 
* @return Service 
*/ 
public function setDescription($description) 
{ 
    $this->description = $description; 

    return $this; 
} 

/** 
* Get description 
* 
* @return string 
*/ 
public function getDescription() 
{ 
    return $this->description; 
} 

/** 
* Get idService 
* 
* @return integer 
*/ 
public function getIdService() 
{ 
    return $this->idService; 
} 
} 

そして、私はコントローラで、何がデータベースに永続化されていないことをやっている場合:

$user->setServices($services); 

$em->persist($user); 
$em->flush(); 

このコード:

print_r($services); 

返し

Doctrine\Common\Collections\ArrayCollection Object ([elements:Doctrine\Common\Collections\ArrayCollection:private] => Array ([0] => AppBundle\Entity\Service Object ([name:AppBundle\Entity\Service:private] => sdfgsdf [description:AppBundle\Entity\Service:private] => sdfgsdf [idService:AppBundle\Entity\Service:private] => 2))) 

そして、このコード:

echo $services[0]->getName(); 

戻り、この:

sdfgsdf 

任意のアイデア?

ありがとうございます! :)

+0

誰でも知っていますか? –

答えて

0

最後に問題が見つかりました! :) :)

私は既存のデータベースからの私のエンティティクラスを生成したので、私は私の「\ SRC \ AppBundle \リソース\のconfig \ドクトリン」フォルダ内のXMLファイルを持っていました。しかし、多対多結合は自動的には生成されないため、手動で追加する必要がありました。

php bin/console doctrine:schema:update --force 

私はすべてが最新であったとの情報を持っていた:

毎回私は、このコマンドを開始しました。しかし、実際に、symfonyはので、私は再び私のスキーマを更新し、XMLファイルを削除して、今それが働いているXMLファイルではなく、注釈に格納されている情報....

を使用しました。私はSymfonyがテーブルservice_offerを更新し、実際には必要でないカラム "id_service_offer"を削除したのを見ました。

1

あなたにもサービスを永続化しようとすることはできますか?例:

$user->setServices($services); 

$em->persist($user); 
$em->persist($services); 
$em->flush(); 
+0

あなたの返事のためにThnaks。そのエラーメッセージが表示されます。クラス 'Doctrine \ Common \ Collections \ ArrayCollection'がチェーン構成の名前空間AppBundle \ Entityに見つかりませんでした。そして私はそれが正常だと思う。 ArrayCollectionを永続化することはできません。または? –

+0

ArrayCollectionをインポートするには、PHPファイルの先頭に 'use'ステートメントを含める必要があります。この行をファイルの先頭に置いてみてください: 'Doctrine \ Common \ Collections \ ArrayCollection;'を使用してください。また、PHPの名前空間とインポートの詳細についてはこちらを参照してください:http://php.net/manual/en/language.namespaces.importing.php –

+0

これは私のUserクラスに既にあります。コントローラーに追加しましたが、同じエラーです。しかし、配列を保持することはできますか? –

関連する問題