2017-06-22 6 views
0

ich meine Benutzer in einer Tabelle angezeigt wird, und ich bin das Abrufen der Firmenname und Stadt mit company_idCakePHP: Anzeigedaten in einer Tabelle mit anderen Tabellendaten

Benutzer:

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 

Unternehmen:

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

Benutzeranzeige:

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

}  

?> 

Also in meiner Firma Display, würde Ich mag admin und Autorennamen abzurufen, etwa so:

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

I Firma bekommen id Benutzer verweisen company_id versucht haben, für den Anfang auf dem richtigen Weg zu bekommen, ohne Erfolg (versucht Eigenschaft nicht-Objekt zu erhalten)

Außerdem wäre es, wenn ich mehrere Autoren und Administratoren haben? Weniger wahrscheinlich, dass mehrere Administratoren pro Unternehmen, kann aber passieren, und einige Autoren ist auf jeden Fall möglich

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; 


} 




} 

Edit: Hinzufügen von Unternehmen/index.ctp, noch zu neu, ich nicht sehen was ist los ...:

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

ich diese Fehler bin immer:

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 entspricht dies:

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

Dank im Voraus

Antwort

2

Das Wichtigste zuerst, Sie können nicht mehrere Verbände mit dem gleichen Namen definieren. Vorausgesetzt, Sie haben ein company_id Feld, das ist eine belongsTo Assoziation aus Sicht der Benutzer.

diese Voraussetzungen, es ist natürlich ein hasMany Verein aus dem Unternehmen Sicht gegeben. Ich gehe davon aus, dass Sie das oben bereits in Ihrer CompaniesTable Klasse festgelegt haben, wenn nicht, dann ist das, was Sie zuerst tun müssen.

Die users Eigenschaft wird dann ein Array von User Rechtsträger Objekte sein, so müssen Sie es entsprechend zugreifen, dh entweder direkt über einen Index:

$company->users[0]->firstname 

oder durch Überlaufen:

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

Wenn Sie die Benutzer nach ihren Rollen getrennt behandeln müssen, könnten Sie sie zum Beispiel entsprechend filtern:

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

oder vielleicht besser noch getrennte Verbände mit Bedingungen schaffen:

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

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

Auf diese Weise können und Zugriff auf die verschiedenen Typen von Benutzern getrennt enthalten könnte:

$company->admins 
$company->authors 

See

auch
+0

Mmmh Ich bin ein unzulässiges Argument für foreach geliefert bekommen mit 'foreach (unternehmens- $> Benutzer als $ user) {' –

+0

Dann 'Benutzer' ist nicht das, was Sie denke, es ist am meisten, weil du die Assoziation nicht enthalten hast. @ Nolan.K – ndm

+0

danke, fügte meine companiesTable hinzu. Versuchen, herauszufinden, was Benutzer dann ist –

Verwandte Themen