2017-03-24 52 views
0

間違った外部キーが使用されている:CakePHPの3 - 同じテーブルにリンクされている2つの外部キー - 私はそれらを結ぶ、独自の属性を持つと2つの外部キーを持つ2つのテーブル、それぞれの持っている

セッション

  • ID
  • staff_id(主要職員) - スタッフのテーブルへの外部キーリンク
  • assistant_id(二次職員) - スタッフテーブルに
  • をリンクする外部キー
  • 日付

スタッフ

  • ID
  • USER_ID(Usersテーブルにリンクする外部キー)

私は検索クエリを実行しようとすると、そのプライマリスタッフとセッションを表示するには、代わりにアシスタントスタッフメンバーを表示しますIndex.ctpにあります。

たとえば、IDが1のSessionにstaff_id = 3およびassistant_id = nullがある場合、IndexのStaff列は空白として表示されます。ただし、assistant_id = 1の場合は、ID = 3(プライマリスタッフ)ではなく、ID = 1のスタッフ(アシスタントスタッフ)が表示されます。私SessionsTableで

、私は次のようしている:私のStaffTableで

$this->belongsTo('Staff', [ 
    'foreignKey' => 'staff_id' 
]); 
$this->belongsTo('Staff', [ 
    'foreignKey' => 'assistant_id' 
]); 

、私は次のようしている:私のSessionsControllerで

$this->hasMany('Sessions', [ 
    'foreignKey' => 'staff_id' 
]); 
$this->hasMany('Sessions', [ 
    'foreignKey' => 'assistant_id' 
]); 

、指数関数はに割り当てられ、次の検索要求を持っていますケーキ変数:

$sessions = $this->Sessions->find('all', [ 
    'contain' => ['Staff'] 
    ]); 

インデックスのctpページでは、テーブルは次のようになりますOWS:私はスタッフとしてログインし、彼らは主要スタッフであるすべてのセッションの検索を行う場合は、検索クエリにに関しても

<table class="bookingsTables display" id="confirmedTable"> 
    <thead> 
     <tr> 
      <th scope="col"><?= $this->Paginator->sort('id', 'ID') ?></th> 
      <th scope="col"><?= $this->Paginator->sort('staff_id', 'Primary Staff Member') ?></th> 
      <th scope="col"><?= $this->Paginator->sort('date', 'Date') ?></th> 
      <th scope="col" class="actions"><?= __('Actions') ?></th> 
     </tr> 
    </thead> 
    <tbody> 
    <?php foreach ($sessions as $session): ?> 
     <tr> 
      <td><?= h($session->id) ?></td> 
      <td><?= $session->has('staff') ? h($session->staff->name) : '' ?></td> 
      <td><?= h($session->date) ?></td> 
      <td class="actions"> 
       <?= $this->Html->link(__('View'), ['action' => 'view', $session->id]) ?> 

      </td> 
     </tr> 
    <?php endforeach; ?> 
    </tbody> 
</table> 

、いずれかを見つけることができません。

$id = $this->Auth->user('id'); //gets the id of the logged in user 
$sessions = $this->Sessions->find('all', [ 
     'contain' => ['Staff'], 
     'conditions' => ['user_id' => $id] 
     ]); //find Sessions where staff_id = staff member who's logged in 

または代替的に:第1が存在する場合

$id = $this->Auth->user('id'); //gets the id of the logged in user 
$sessions = $this->Sessions->find('all', [ 
    'contain' => ['Staff', 'Staff.Users'], 
    'conditions' => ['Users.id' => $id] 
]); //find Sessions where staff_id = staff member who's logged in 

答えて

1

ケーキは、スタッフの最初のインスタンスを上書きします。これを避けるために、あなたのモデルは次のようにする必要があります:

$this->belongsTo('Staff', [ 
    'className' => 'Staff', 
    'foreignKey' => 'staff_id', 
    'propertyName' => 'staff' 
]); 

$this->belongsTo('Assistant', [ 
    'className' => 'Staff', 
    'foreignKey' => 'assistant_id', 
    'propertyName' => 'assistant' 
]); 

そして、あなたのビューでと

<td><?= $session->has('staff') ? h($session->staff->name) : '' ?></td> 

を置き換える:

動作しません
<td><?= $session->has('staff') ? h($session->staff->name) : $session->has('assistant') ? h($session->assistant->name) : '' ?></td> 
+0

、問題はエイリアスがなければならないということです一意であれば、両方の関連付けに「スタッフ」を使用することはできません。アシスタントに名前を付ける必要があります。これにより、固有のプロパティ名が自動的に確保されます。同様に、「StaffTable」の関連付けを変更する必要があります。 – ndm

+0

ありがとうndm、一意の名前を修正するために私の答えを編集しました。 –

+0

アシスタントは表示されますが、メインスタッフは表示されません。 Cake変数では、SessionにはStaffではなくAssistantが含まれます。私はその反対を達成したいと思います。 – mistaq

関連する問題