2017-06-22 76 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 
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 
       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;?>  

我试图让公司ID的引用COMPANY_ID在用户对于初学者走上正轨,没有成功(试图获得非对象的财产)

此外,如果我有几个作者和管理员,它会工作吗?不太可能每个公司的几个管理员,但可能发生,几位作者是definetely可能

companiesTable:

<?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; 


} 




} 

编辑:增加公司/ 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:

<?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); 
    } 
} 

由于事先第一

回答

2

第一件事,你不能使用相同的名称定义多个关联。考虑到您有一个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我得到使用'的foreach($公司 - >用户以$用户)提供的foreach无效参数{' –

+0

然后'users'是不是你认为它是,最像是因为你没有包含该协会。 @ Nolan.K – ndm

+0

谢谢,添加了我的公司表。试图找出用户是什么 –

相关问题