1

私は Symfony2 の初心者ですが、Rails を使用しています。Symfony2 で次のようなことをしたいと思います。

class Manager < ActiveRecord::Base
    has_many :employees
end

次に、次のようにオブジェクトに尋ねます。

m = Manager.find(1)
# Sends SQL query SELECT COUNT * FROM EMPLOYEES WHERE MANAGER_ID = 1
count = m.employees.count

# Sends SQL query SELECT * FROM EMPLOYEES WHERE MANAGER_ID = 1
m.employees.each do |e|
    puts e.name
end

私はSymfony2にこのコードを持っています...

/**
 * @Entity @Table(name="Manager")
 */
class Manager
{
    /**
     * @Id @Column(type="integer") @GeneratedValue
     */
    public $id;

    /**
     * @Column(type="string")
     */
    public $description;


   /**
    * @OneToMany(targetEntity="User", mappedBy="manager")
    * @var User[]
    */
    private $employees;
}

Symfony2 でこれらの (上記の) 機能 (ORM によって RoR で簡単に作成) を実装するにはどうすればよいですか?

手伝ってくれてありがとう...

神話ラッシュ

4

2 に答える 2

1
m = Manager.find(1)
# Sends SQL query SELECT * FROM EMPLOYEES WHERE MANAGER_ID = 1
m.employees.each do |e|
    puts e.name
end

Manager id に応じて Employees を探しているようです。

一対多の双方向関係から始めましょう ( doctrine documentation )

<?php
/** @Entity **/
class Manager
{
    // ...
    /**
     * @OneToMany(targetEntity="Employee", mappedBy="manager")
     **/
    private $employees;
    // ...

    public function __construct() {
        $this->employees = new \Doctrine\Common\Collections\ArrayCollection();
    }
}

/** @Entity **/
class Employee
{
    // ...
    /**
     * @ManyToOne(targetEntity="Manager", inversedBy="employees")
     * @JoinColumn(name="manager_id", referencedColumnName="id")
     **/
    private $manager;
    // ...
}

コントローラー

<?php
  // src/Acme/DemoBundle/Controller/ManagerController.php

  // ...
  public function showAllEmployeesForManagerAction($managerId)
  {
    $repo = $this->getDoctrine()->getRepository('AcmeDemoBundle:Manager');

    $manager         = $repo->find(managerId);
    $employees       = $manager->getEmployees();
    // counting employees
    $employeesNumber = count($employees); // not passed to template

    return $this->render('AcmeDemoBundle:Employees:list.html.twig', array(
        'manager' => $manager,
        'employees' => $employees,
    ));
  }

テンプレート

{# src/Acme/DemoBundle/Resources/views/Employees/list.html.twig #}

{% extend '::base.html.twig' %}

{% block body -%}
    <h2>Employees depending on Manager {{manager.name}}</h2>
    <p>Number of employees : {{employees|length}}</p>
    <ul>
    {% for employee in employees %}
       <li>{{ employee.name }}</li>
    {% endfor %}
    </ul>
{% endblock %}

これがうまくいくことを願っています。

デビッド

于 2012-11-15T13:53:16.730 に答える
0

Dcotrine2 orm を使用すると、次のようになります。

<?php
// src/Acme/DemoBundle/Controller/ManagerController.php

// ...
public function showAllAction()
{
    $repo = $this->getDoctrine()->getRepository('AcmeDemoBundle:Manager');
    $managers = $repo->findAll();

    return $this->render('AcmeDemoBundle:Manager:list.html.twig', array(
        'managers' => $managers,
    ));
}
{% extend '::base.html.twig' %}

{% block body -%}
    {% for manager in managers -%}
        {{ manager.name }}
    {% endfor %}
{% endblock %}

詳細については、Symfony2 doctrine docsおよびtemplating docs を参照してください。


ただし、RoR は Active Record を使用して、データベースから読み取った情報を永続化します。Symfony2 には「モデル」はありません。好きなものを使用できます。デフォルトでは Doctrine2 を使用しますが、Propelも含まれています。

お気に入りの「モデル」ライブラリも使用できます。PHP でアクティブ レコードのようなものを探している場合は、使用できる便利なライブラリがたくさん見つかります。

于 2012-11-15T12:23:23.997 に答える