0

プロジェクトにsymfony 1.4を使用しています(すでに開始されています)。現在、いくつかのものを変更しています.2つのテーブル間の情報を照会すると、関係のエラーが発生します.1つはすでに存在し、もう1つは新しいものです。最初のテーブルを指す外部キーがあります。

このようなエラーメッセージが表示されます

exception 'Doctrine_Table_Exception' with message 'Unknown relation alias ' in /var/www/testorange/symfony/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Relation/Parser.php:237 

Stack trace: #0 /var/www/testorange/symfony/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Relation/Parser.php(235): Doctrine_Relation_Parser->getRelation('', false)

...

そしてさらに多くのエラー。

したがって、symfony での定義にテーブルがまだ適切な関係を持っていないためだと思います (それらは既に私の DB に関連付けられています)。

この行を自分の schema.yml に追加してから [UPDATED]

 OhrmTrainningSubmit:
  connection: doctrine
  tableName: ohrm_trainning_submit
  columns:
    id_trainning_submit:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    trainning:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    trainning_detail:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    answer:
      type: string(250)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    state:
      type: integer(1)
      fixed: false
      unsigned: false
      primary: false
      default: '0'
      notnull: true
      autoincrement: false
    user:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
  relations:
    OhrmUser:
      local: user
      foreign: emp_number
      type: many
    OhrmTrainning:
      local: trainning
      foreign: id_trainning
      type: many

これは OhrmUser の定義です

OhrmUser:
  connection: doctrine
  tableName: ohrm_user
  columns:
    id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    user_role_id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    emp_number:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    user_name:
      type: string(40)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    user_password:
      type: string(40)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    deleted:
      type: integer(1)
      fixed: false
      unsigned: false
      primary: false
      default: '0'
      notnull: true
      autoincrement: false
    status:
      type: integer(1)
      fixed: false
      unsigned: false
      primary: false
      default: '1'
      notnull: true
      autoincrement: false
    date_entered:
      type: timestamp(25)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    date_modified:
      type: timestamp(25)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    modified_user_id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
    created_by:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
  relations:
    HsHrEmployee:
      local: emp_number
      foreign: emp_number
      type: one
    OhrmUserRole:
      local: user_role_id
      foreign: id
      type: one
    HsHrMailnotifications:
      local: id
      foreign: user_id
      type: many
    OhrmLeaveAdjustment:
      local: id
      foreign: created_by_id
      type: many
    OhrmLeaveComment:
      local: id
      foreign: created_by_id
      type: many
    OhrmLeaveEntitlement:
      local: id
      foreign: created_by_id
      type: many
    OhrmLeaveRequestComment:
      local: id
      foreign: created_by_id
      type: many
    OhrmTimesheetActionLog:
      local: id
      foreign: performed_by
      type: many

参照を作成したいテーブルで、参照を作成するフィールドは、テーブル「OhrmUser」への「user」からフィールド emp_number へ(この方法で正しいはずだと思います)、問題はまだ同じエラーです、誰かがこれについて考えていますか?他にすべきことはありますか?

追加した後、これを実行します

php symfony cc
php symfony doctrine:build-model
php symfony orangehrm:publish-assets
php symfony cc

クエリ

try{
$q = Doctrine_Query::create()
 ->select('*')
->from('OhrmTrainningSubmit TS')
->innerJoin('TS.OhrmUser U')
->addWhere("TS.trainning = $training")
->andWhere("TS.user = $employee");
$result = $q->execute();
    return $result;
}catch(Exception $e){
    print_r ($e->getMessage());
    return null;
}

OhrmTrainningSubmit のデータにしかアクセスできないのですが、User のフィールドにアクセスしようとすると内部エラーが発生します。

このコードでエラーが発生します

foreach ($detail as $det){
    echo $det['answer']; // This is printed with no problem
    //echo $det['user_name']; <-- this one comes from the table OhrmUser, I get server error with this one
}

$detail は、クエリの戻り値を持つ変数です。

私が作るとき

->select('TS.*, U.*')

他のエラーが表示されます。

不明なプロパティ emp_number

何か案が?

前もって感謝します。

4

1 に答える 1

1

2つのこと:

  1. スキーマで、関係の近くに正しいインデントがあることを確認してください。

      autoincrement: false
    relations:
      OhrmUser:
        local: user
        foreign: emp_number
        type: many
    
  2. クエリは次のようになります。

    $q = Doctrine_Query::create()
        ->from('TrainningSubmit T')
        ->innerJoin('T.OhrmUser U')
        ->where('T.id_trainning = ?', $id);
    

doctrine で join を指定するときは、関係がどこから来るのかを ORM に伝える必要がありT.OhrmUser UますOhrmUser U。これは、モデルOhrmUserからの関係を使用していることを教義に伝えます。T

->where()さらに、最初のものを上書きする2番目の場所であるため、2回使用しましたが、これは間違っています。複数の条件を追加する場合は、 ->andWhere()orを使用する必要があります。それにもかかわらず、doctrine で名前付きリレーションを扱う場合、どの列を結合する必要があるかを明示的に doctrine に伝える必要はありません - スキーマ ファイルのおかげで、doctrine は既にそれを知っています。->orWhere()where

さらに、結合の条件を拡張する必要がある場合は、 を使用して簡単に行うことができますWITH

 ->join('T.OhrmUser U WITH U.name LIKE ?', 'Michal')

に変換されます:

 JOIN OhrmUser U ON U.emp_number = T.user AND U.name LIKE 'Michal'

編集

オブジェクトからデータを取得するには、次を使用します。

//if you return a plain array as a result of the query:
echo $det['answer'];
echo $det['OhrmUser']['user_name'];

//if you return an array of objects:
echo $det->getAnswer();
echo $det->getOhrmUser()->getUserName();
于 2013-04-16T15:02:43.127 に答える