0

私はエンティティユーザーを持っています

class Users
{
  //...

/**
 * @ORM\Column(name="firstName", type="string", length=50, nullable=true)
 */
private $firstname;

public function getFirstname()
{
    return $this->firstname;
}

/*
*@ORM\OneToMany(targetEntity='Worksamples', mappedBy='user')
*/
private $worksample;

public function __constraction()
{
    $this->worksample = new ArrayCollection();
}

public function getWorksample()
{
    $this->worksample;
}

}

Worksamples と呼ばれる別の 1 つのエンティティ

class Worksamples
{
 //...

/**
 * @ORM\Column(name="sampleSource", type="string", length=255, nullable=false)
 */
private $samplesource;

public function getSamplesource()
{
    return $this->samplesource;
}

/**
 * @ORM\Column(name="UserId", type="integer", nullable=false)
 */
private $userid;   

public function getUserid()
{
    return $this->userid;
}


/*
*@ORM\ManyToOne(targetEntity="Users", inversedBy="worksample")
*@ORM\JoinColumn(name="UserId", referencedColumnName="id")
*/
private $user;

public function getUser()
{
    return $this->user;
}

}

私のコントローラーには、このアクションがあります

public function indexAction($id)
{
    $user = $this->getDoctrine()
        ->getRepository('AcmeWellcomeBundle:Users')
        ->find($id);

    $sample = $user->getWorksample()->getSamplesource();

    return $this->render('AcmeWellcomeBundle:Default:index.html.twig', array('sample' => $sample));

}

そして、私はこのエラーがあります

FatalErrorException: エラー: ... 内の非オブジェクトに対するメンバー関数 getSamplesource() の呼び出し

User には多くの Worksamples があり、Worksample には 1 つの User しかないと想定されていました。

助けはありますか?

4

1 に答える 1

2

コードを使用する前に

アプリのコンソールからクラスを実行しましたか? サーバー上のSSHを介して端末またはコンソールでこれを実行しない場合:

php app/console doctrine:generate:entities [YourVendorName]

その後、次を使用してデータベースを更新します。

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

そしてキャッシュをクリアします:

app/console cache:clear

これらの手順により、すべての注釈が実際に使用され、データベースが正しく設定されていることが確認されます。

次に: in は不要で、private $userid;inWorksamplesも必要ありません。Doctrine はこれらすべてを処理します。また、常に単一のオブジェクトを返すことはなく、単一のオブジェクトを返すことはないため、名前を に変更するとよいでしょう。$this->worksample = new ArrayCollection();Users$worksample$worksamplesarrayCollection

すべてが正しく設定されたら、この特定のオブジェクトにアタッチされた$workspace->getUser()クラスのオブジェクトを返す which を使用するだけです。User

コントローラーで

まず、worksamples のリストを取得します。次に、ワークサンプルがオブジェクトに取り付けられているかどうかを確認します。次に、たとえば、リストの最初のオブジェクトから vlue を取得します。

$samples = $user->getWorksamples();
if ($samples) {
    $sample = $samples[0]->getSamplesource();
}

いくつかのメモ:

  • クラスのコンストラクターは呼び出され、 では__construct()ありません__constraction()
  • 単一のオブジェクトがユーザーまたはワークスペースを表すため、クラスにも名前Userを付けWokrspace、単数形にする必要があります。
于 2013-08-28T08:53:53.880 に答える