2017-06-22 38 views
0

私はテーブルに私のユーザーを表示しています、と私はのcompany_idCakePHPの:他のテーブルのデータを持つテーブルの表示データ

ユーザーと会社名や都市を取得しています:

id lastname firstname company_id role 
1 doe   john  2   author 
2 deo   jenne  2   admin 
3 deus  Joe   1   admin 
4 Stewart  Rob   1   author 

企業:

id name    city 
1 New-York Company New-York 
2 Paris Company  Paris 

ユーザディスプレイ:

  <?php 
       foreach($users as $user):?> 
       <tr> 
        <td><?= $user->lastname?></td> 
        <td><?= $user->firstname?></td> 
        <td><?= $user->companies->name ?></td> 
        <td><?= $user->companies->city?></td> 
        <td><?= $user->role?></td> 
       </tr> 
       <?php endforeach;?>  

usersTable.php:

   <?php 
       foreach($companies as $company):?> 
       <tr> 
        <td><?= $company->name?></td> 
        <td><?= $company->city?></td> 
        <td><?= $company->users-> *adminlastname* ?></td> 
        <td><?= $company->users-> *adminfirstname* ?></td> 
        <td><?= $company->users-> *authorlastname* ?></td> 
        <td><?= $company->users-> *authorfirstname* ?></td> 
       </tr> 
       <?php endforeach;?>  

私は、ユーザーの参照のcompany_idに企業IDを取得しようとしている:

<?php 
namespace App\Model\Table; 

use Cake\ORM\Table; 
use Cake\Validation\Validator; 

class UsersTable extends Table 
{ 
    public function initialize(array $config){ 
     $this->belongsToMany('Companies'); 
     $this->belongsTo('Companies', [ 
     'foreignKey' => 'company_id', 
    ]); 
} 

}  

?> 

だから私の会社のディスプレイに、私はそうのように、管理者や作者名を取得したいと思います(非オブジェクトのプロパティを取得しようとしている)成功しなかったために、初心者のために

さらに、私はいくつかの作者と管理者がいればうまくいくのだろうか?

<?php 
namespace App\Model\Table; 

use Cake\ORM\Table; 
use Cake\Validation\Validator; 

class companiesTable extends Table 
{ 

public function initialize(array $config){ 
    //$this->addBehavior('Timestamp'); 
    $this->hasMany('Users'); 
    $this->hasMany('companies', [ 
     'foreignKey' => 'identite', 
    ]); 
    $this->hasMany('Admins', [ 
'className' => 'Users', 
'conditions' => [ 
    'Admins.role' => 'admin' 
    ] 
]); 

$this->hasMany('Authors', [ 
    'className' => 'Users', 
    'conditions' => [ 
     'Admins.role' => 'author' 
    ] 
]); 


} 

public function isOwnedBy($companyId, $userId){ 
    $company = $this 
     ->find('all',['conditions' => ['companies.id'=>$companyId]]) 
     ->matching('Users', function ($q) use ($userId) { 
      return $q->where(['Users.id' => $userId]); 
     }) 
     ->first(); 
    if ($company) return true; 
    return false; 


} 




} 

編集:以下の企業ごとに複数の管理者に可能性が高いが、発生する可能性があり、いくつかの著者definetely可能

companiesTableです会社/ index.ctpを追加し、まだあまりにも新しいが、私はまったく表示されません...何が悪い:

<div class="row"> 
    <div class="medium-4 small-12 columns"> 
     <div style="padding: 22px;"> 
      <h2>companies</h2> 

     </div> 

    <div id="customAdd" style="clear:both;padding: 22px;"> 
      <a href="/companies/add" class="button secondary right" data-reveal-id="Modal" data-reveal-ajax="true">add</a>   
<div style="clear:both;height:0px;"></div> 
    </div> 



     <div id="customSearch" style="clear: both;padding: 22px"> 
      <p style="font-size:36px; display: inline-block;">search for a company</p><input type="text" id="searchBox"> 
     </div> 


    </div> 
    <div class="medium-8 small-12 columns"> 
     <div> 

      <table id="companies" class="cell-border dataTable no-footer"> 
       <thead> 
        <tr> 
         <th>name</th> 
         <th>city</th> 
         <th>last name</th> 
         <th>first name</th> 

        </tr> 
       </thead> 
       <tbody> 
        <?php foreach ($company->users as $user):?> 

        <tr class='clickable-row' data-href="/companies/edit/<?= $company->id?>"> 

        <td><?= $company->name?></td> 
        <td><?= $company->city?></td> 
        <td><?= $company->users[0]->lastname?></td> 
        <td><?= $company->users[0]->firstname?></td> 

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

     </div> 
    </div> 
</div> 

私はこれらのエラーを取得しています:

Notice (8): Undefined variable: company [APP/Template/Companies/index.ctp, line 36] 
Notice (8): Trying to get property of non-object [APP/Template/Companies/index.ctp, line 36] 
Warning (2): Invalid argument supplied for foreach() [APP/Template/Companies/index.ctp, line 36] 

WHI chがこれに該当する:

<?php foreach ($company->users as $user):?> 

CompaniesController:

答えて

2

まず物事まず事前に

<?php 

namespace App\Controller; 

use Cake\ORM\TableRegistry; 


class CompaniesController extends AppController{ 

    public function index(){ 
     $companies = $this->Companies 
      ->find('all',['order' => ['Companies.name' => 'ASC']]); 
     $this->set(compact('companies')); 

     $this->loadModel('Users'); 
     $users = $this->Users->find('all') 
      ->contain(['companies']); 
     $this->set(compact('users')); 




    } 

    public function view($id = null){ 
     $company = $this->Companies->get($id); 
     $this->set(compact('company')); 
    } 

    public function add(){ 
     $company = $this->Companies->newEntity(); 
     if ($this->request->is('post')) { 

      if ($this->Companies->save($company)) { 

       $this->Flash->success(__('Your company has been saved.')); 

       return $this->redirect(['action' => 'index']); 
      } 
      $this->Flash->error(__('Unable to add your company.')); 
     } 
     $this->set('company', $company); 

     $this->set(compact('companies')); 
    } 

    public function edit($id = null){ 
     $company = $this->Companies->get($id); 
     if ($this->request->is(['post', 'put'])) { 
      $company = $this->Companies->patchEntity($company, $this->request->data,['associated' => ['Users']]); 


      if ($this->Companies->save($company)) { 



       $this->Flash->success(__('Your company has been updated.')); 
       return $this->redirect(['action' => 'index']); 
      } 

      $this->Flash->error(__('Unable to update your company.')); 
     } 


     $this->set('company', $company); 

     $this->set(compact('companies')); 

    } 

    public function delete($id){ 
     $this->request->allowMethod(['post', 'delete']); 
     $company = $this->Companies->get($id); 
     if ($this->Companies->delete($company)) { 
      $this->Flash->success(__('The company with id: {0} has been deleted.', h($id))); 
      return $this->redirect(['action' => 'index']); 
     } 
    } 

    public function isAuthorized($user){ 
     if ($this->request->action === 'logout') { 
      return true; 
     } 
     if ($this->request->action === 'settings') { 
      return true; 
     } 
      return parent::isAuthorized($user); 
    } 
} 

おかげで、あなたは、同じ名前の複数の関連付けを定義することはできません。 company_idフィールドがあると、ユーザーの観点からはbelongsToの関連付けが行われます。

これらの前提条件が満たされていると、当然のように会社の観点からはhasManyの関連付けになります。私はあなたがすでにあなたのCompaniesTableクラスにそれを設定していると仮定します。そうでなければ、まずそれが必要です。

usersプロパティは、その後User entitiyオブジェクトの配列となりますので、あなたがそれに応じてそれにアクセスする必要があり、それは、直接インデックスを経由する:

$company->users[0]->firstname 

またはそれを反復することにより:

foreach ($company->users as $user) { 
    // $user->firstname 
} 

ロールで区切られたユーザーを処理する必要がある場合は、たとえばそれに応じてフィルタを適用できます。

$admins = collection($company->users)->filter(function ($user) { 
    return $user->role === 'admin'; 
}); 

または多分いっその条件を使用して別の関連付けを作成します。

$this->hasMany('Admins', [ 
    'className' => 'Users', 
    'conditions' => [ 
     'Admins.role' => 'admin' 
    ] 
]); 

$this->hasMany('Authors', [ 
    'className' => 'Users', 
    'conditions' => [ 
     'Admins.role' => 'author' 
    ] 
]); 

あなたが個別に異なるタイプのユーザーが含まれており、アクセスすることができましたその方法は:

$company->admins 
$company->authors 

も参照してください

+0

Mmmh私は{ ' –

+0

が続いて' users'は何ではない 'foreachの($ユーザとして$会社 - >ユーザー)を使用してforeachのために供給無効な引数を取得していますあなたがその協会を含んでいないので、ほとんどそうです。 @ Nolan.K – ndm

+0

ありがとう、私の会社のテーブルを追加しました。 –

関連する問題