2017-07-20 7 views
1

コントローラから2つのテーブルデータを表示する方法。Symfony3 - コントローラ内の2つのテーブルの結合クエリを作成する

ここに私のコントローラのコードです。

class TestController extends Controller 
{ 
    public function showAction(Request $request) 
    { 
     $em = $this->getDoctrine()->getManager(); 
     $teacher = $this->getDoctrine()->getRepository(Teacher::class); 

     $query = $em 
     ->createQueryBuilder('t') 
     ->from('AppBundle:Teacher','t') 
     ->Join('AppBundle:Student','s') 
     ->where('t.id=id and s.tid=tid') 
     ->getQuery() 
     ->getResult(); 
    } 
} 

print_rの場合、1つのテーブルデータしか表示されません。 助けてください

答えて

1

以下の解決策を確認してください。

$query = $em 
     ->createQueryBuilder('t.*,s.*') 
     ->from('AppBundle:Teacher','t') 
     ->Join('AppBundle:Student','s') 
     ->where('t.id=id and s.tid=tid') 
     ->getQuery() 
     ->getResult(); 
    } 

動作しない場合は教えてください。

+0

のコメントを取得したいとします) 'メソッドは、移入する必要があるエンティティのエイリアスを定義するだけです。可能な解決策については、私の答えをご覧ください。 – W0rma

1

エンティティ内のTeacherStudentの関係を定義したとします。この場合、オブジェクトを取得するには、$teacher->getStudents()Teacherエンティティクラスでこのようなメソッドを定義したものとします)を呼び出します。あなたがそのような何かを追加することにより、$teacher->getStudents()通話の追加クエリの必要性を回避することができますQueryBuilderオブジェクトで

<?php 
use Doctrine\Common\Collections\ArrayCollection; 

/** @Entity */ 
class Teacher 
{ 
    // ... 
    /** 
    * One Teacher has Many Students. 
    * @OneToMany(targetEntity="Student", mappedBy="teacher") 
    */ 
    private $students; 
    // ... 

    public function __construct() { 
     $this->students = new ArrayCollection(); 
    } 
} 

/** @Entity */ 
class Student 
{ 
    // ... 
    /** 
    * Many Students have One Teacher. 
    * @ManyToOne(targetEntity="Teacher", inversedBy="students") 
    * @JoinColumn(name="teacher_id", referencedColumnName="id") 
    */ 
    private $teacher; 
    // ... 
} 

:1対多の関係のためのDoctrine documentation about association mapping

例を参照してください

$query = $em 
    ->createQueryBuilder('t') 
    ->from('AppBundle:Teacher','t') 
    ->join('AppBundle:Student','s') 
    ->select(array('t', 's')) 
    ->where('t.id=id and s.tid=tid') 
    ->getQuery() 
    ->getResult(); 
} 

あなたのエンティティで上記のようにTeacherStudentの間に定義された関係がある場合は、参加を簡素化することもできます:

$query = $em 
    ->createQueryBuilder('t') 
    ->from('AppBundle:Teacher','t') 
    ->join('t.students', 's') 
    ->select(array('t', 's')) 
    ->getQuery() 
    ->getResult(); 
} 

FurthmoreあなたはTeacherRepositoryオブジェクトを介してQueryBuilderオブジェクトを作成した場合from()メソッドを呼び出す必要はありません。

$query = $teacher 
    ->createQueryBuilder('t') 
    ->join('t.students', 's') 
    ->select(array('t', 's')) 
    ->getQuery() 
    ->getResult(); 
} 
0

まず私たちは、学生に参加、その後、教師テーブルからすべてを選択します。教師モデルの関係名が学生であるとします。リポジトリー・ファイルに:

public function getWithStudents() { 
    return $this->createQueryBuilder('t') 
     ->Join('t.student', 's') 
     ->addSelect('s') 
     ->getQuery()->getArrayResult(); 
} 

次にコントローラでそれを呼び出す:

$teachersWithStudents = $teacher->getWithStudents();

それとも、この場合、あなただけの

$teachersWithStudents = $teacher->getStudents();

1
$query = $em 
    ->createQueryBuilder('t') 
    ->add('select', 't,s') 
    ->from('AppBundle:Teacher', 't') 
    ->Join('AppBundle:Student', 's') 
    ->where('t.id = s.tid') 
    ->getQuery() 
    ->getResult(); 

それは完璧な作業をすることができます。

0

は `createQueryBuilder(の最初のパラメータとして予想通り、私はこれが動作することはないと思うあなたは2つのtables.commentテーブルとarticleテーブルを持っているとあなたはそれぞれの記事

$commentContent = $em 
      // automatically knows to select Comment 
      // the "c" is an alias you'll use in the rest of the query 
      ->createQueryBuilder('c') 
      ->select('c.message, c.name')////Fields required to display 
      ->from('AppBundle:Comment','c') 
      ->join('AppBundle:Article','a') 
      ->where('c.idArticle=a.id and c.publish_mainPage = 1') 
      ->orderBy('c.idArticle', 'DESC') 
      ->getQuery() 
      ->getResult(); 

var_dump($commentContent); 
関連する問題