CakePHP アソシエーション機能

アソシエーションとは

モデル同士の関連の定義

アソシエーション一覧

ユーザー、プロフィール、記事、タグのモデル定義例

種別 関係 機能
hasOne 1対1 ユーザは1つだけプロフィールを持つ
hasMany 1対多 ユーザは複数の記事を持つ
belongsTo 多対1 記事は1つのユーザーに属している
belongsMany 多対多 タグは複数の記事に属している
モデル

※src\Model\Table\ProductsTable.php
class ProductsTable extends Table
{
  public function initialize(array $config)
  {
    ~
    $this->hasOne('Receipt', [
      'foreignKey' => 'product_id',
      'bindingKey' => 'id'
    ]);
    
    $this->hasMany(~, [
      'foreignKey' => ~,
    ]);
  }
}

※src\Model\Table\ReceiptTable.php
class ReceiptTable extends Table
{
  public function initialize(array $config)
  {
    ~
    $this->belongsTo('Users', [
      'foreignKey' => 'user_id',
      'joinType' => 'INNER',
    ]);

    $this->belongsTo('Products', [
      'foreignKey' => 'product_id',
      'joinType' => 'RIGHT',
    ]);
  }
}

コントローラ

※src\Controller\WatchesController.php
class WatchesController extends AppController
{
  public function productList(){

   $products = $this->Products
    ->find()
    ->contain(['receipt'])
    ->where(['Products.col1!=' => '0'])
    ;

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

※src\Controller\AdminsController.php
class AdminsController extends AppController
{
  public function receipt(){
    $receipts = $this->paginate(
      $this->Receipt
       ->find()
       ->contain(['products', 'users'])
       );

    $this->log($receipts);

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

ビュー

※src\Template\Watches\product_list.ctp
<table>
  ~
  <?php foreach ($products as $product): ?>
  <tr>
   <td><?= h($product->col1) ?></td>
    <td><?= h($product->Receipt['col1']) ?></td>
  </tr>
  <?php endforeach; ?>
</table>