So I asked a question about how to display data from 2 tables here. The person who helped me seems to be pointing out that it should work if my association was done. But as the newbie I am, I am wrongfully not seeing why it's not working.
I am getting the following errors :
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]
which corresponds to this :
<?php foreach ($company->users as $user):?>
in my Companies/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>
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'],
'contain' => ['Users'],
]
);
$this->set(compact('companies'));
}
public function view($id = null){
$companies = $this->Companies->get($id);
$this->set(compact('companies'));
}
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);
}
}
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;
}
}
Feel free to ask more
Quite lost...I'm doing this in my index.ctp :
<?php $x =0;
foreach ($companies->users as $user):?>
<tr class='clickable-row' data-href="companies/edit/<?= $companies->id?>">
<td><?= $companies->users[$x]->name?></td>
<td><?= $companies->users[$x]->city?></td>
<td><?= $companies->users[$x]->admins?></td>
<td><?= $companies->users[$x]->authors?></td>
</tr>
<?php $x++;
endforeach;?>
And I get those errors :
Notice (8): Undefined property: Cake\ORM\Query::$users
Warning (2): Invalid argument supplied for foreach()
which still corresponds to my foreach()
My CompaniesController index and view functions :
public function index(){
$companies = $this->Companies
->find('all', [
'order' => ['Companies.name' => 'ASC'],
'contain' => ['Users'],
]
);
$this->set(compact('companies'));
}
public function view($id = null){
$company = $this->Companies->get($id);
$this->set(compact('company'));
}
my CompaniesTable :
<?php
namespace App\Model\Table;
use Cake\ORM\Table;
use Cake\Validation\Validator;
class CompaniesTable extends Table
{
public function initialize(array $config){
$this->hasMany('Users');
$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;
}
}
You are setting the variable $companies
in the index method of your users controller, but referencing $company
in the view.
It should work if you reference the $companies
in the view.
You can use contain
to specify what associated data is loaded.
$companies = $this->Companies
->find('all', [
'order' => ['Companies.name' => 'ASC'],
'contain' => ['Users'],
]
);
You can read more about retrieving data in the docs
I think that the problem is with how you are trying to access to object properties. Try something like this:
foreach ($companies as $company) {
$company->users; // each company has many users
// if you want to loop over each company's users
foreach ($company->users as $user) {
//etc
}
}