質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • PHP

    20877questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    6029questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • CakePHP

    2362questions

    CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

cakephp アソシエーションでモデル名、コントローラ名が特殊(?)な場合の設定方法

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 841

hogetail

score 35

 環境と現状

  • cakephp2.7 (フレームワーク初挑戦です)
  • mysql

  • DBの構造
  - Sites
    - id
    - site_name
    - site_url
  - Articles
    - id
    - site_id (Sites の id と連動しています)
    - article_title
    - article_url
    - pub_date (記事が更新された時間です)

  • Contoller
  - IndexesController.php
class IndexesController extends AppController {

  public $uses = ['Article'];

  public function index() {
    $indexArticles = $this->Article->find('all', array(
      'fieleds' => array('article_title', 'article_url', 'pub_date'),
      'order' => array('pub_date' => 'desc'),
      'limit' => 50
    ));

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

  }

  • Model

  • View
  - Indexes/index.ctp
<table>
  <tr>
    <th>更新時間</th>
    <th>記事タイトル</th>
  </tr>
<?php

foreach ($indexArticles as $data) {
  $title = $data['Article']['article_title'];
  $link = $data['Article']['article_url'];
  $pub_date = $data['Article']['pub_date'];

  echo '<tr>';
  echo '<td>'.$pub_date.'</td>';
  echo '<td><a href="'.$link.'" target="_blank">'.$title.'</a></td>';
  echo '</tr>';
}
?>
</table>


となっており、Articles からの記事情報の取得はできています。
これで index ページに記事の一覧を表示させています。


 目的


  • hoge.com というアンテナサイトを構築する。
  • hoge.com のトップページは、最新記事の一覧とサイト名が羅列されている。
  • (↓蛇足)
  • hoge.com/Sites/ で登録されているサイト一覧
  • hoge.com/Sites/1 で Sites id 1 のサイトの最新記事一覧が表示される



cakephp のアソシエーションを利用してこのような記事リンクに対してサイト名の表示をしたいのが目的です。
  
http://kita-kore.com/ のようなアンテナサイトを想像してもらえるとわかりやすいかと思います。

イメージ説明
ひと通りcakephp のチュートリアルを勉強した結果、アソシエーションの $hasMany を使うのかなと想像しているのですが、どういう構築をしたらいいのかわかりません。

Controller を IndexesController.php としているのがそもそもナンセンスなのか
SitesController.php でやりたい処理を書くのか、というのも理解していません。

是非、ご回答よろしくお願いします。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

こんにちは。

アソシエーションに関してお答えしますと、
誤解が無ければ次のようにすると
ご期待するデータを取得できるのではないかと思われます。

※Sitesテーブルに対応しているSite Modelがあるものと仮定しています。

IndexesController.php:

$this->Article->bindModel(array(
    'belongsTo' => 'Site',
));
$indexArticles = $this->Article->find('all', array(

ControllerでArticleからfindする前にこのようにbindした状態であれば、
Indexes/index.ctpでは次のようにサイト名を取得可能かと思われます。

index.ctp:

foreach ($indexArticles as $data) {
    $data['Site']['site_name'];
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/31 17:51

    ご回答ありがとうございます。

    > ※Sitesテーブルに対応しているSite Modelがあるものと仮定しています。

    こちらは
    Model/Site.php に記述するものでしょうか?

    それとも
    Model/Index.php というファイルを作成して
    IndexesController.php で利用できるようにするのでしょうか?

    根本的な理解がなっていないかもしれませんが、ご回答頂ければと。

    キャンセル

  • 2015/07/31 18:16

    Model/Article.phpがあるものと思っておりましたので、同様の要領でModel/Site.phpもあれば問題ないと思っていました。
    もしModel/Article.phpもないようでしたら、Articleと同様な記述でpublic $uses = ['Article','Site'];のように加えて使うのか、ちょっとこのような利用をしたことが無いので明確にはお答えできませんがどうでしょう?

    キャンセル

  • 2015/07/31 18:25 編集

    上のコメントは勘違いがあるかもしれません。
    回答にbindModel()する場所を追記しました。
    $this->Article->find()する直前に$this->Article->bindModel()を加えてみてください。

    キャンセル

  • 2015/07/31 18:33

    ご回答ありがとうございます。

    現状では Model/Article.php も Model/Site.php も作成しておりませんでした。
    理由は Model を作成しなくても IndexesController.php から articles テーブルから情報を find することができていたからです。
    ですが、このやり方、考え方がそもそも間違っているのでしたらご指摘ください。

    Model の扱いは今のところ、バリデーション、アソシエーション以外に使い道がわかっておりません。

    キャンセル

  • 2015/07/31 19:00 編集

    Modelを用意しなくても動くのですね…それは知りませんでした。

    MVCの考え方としてDBからデータのやり取りを行うにあたりModelを用意するのが望ましいとされています。
    私自身100%その考え方を熟知しているかと言われますと自身はありませんのでMVCについてはGoogleなどで詳細な説明をされているサイトを参考にされると良いかと思われます。

    Controllerで直接find()するのは個人的にはあまり行いません。
    Modelに抽出するためのfunctionを用意してデータをとってきていたりします。
    * 同様のデータ抽出をControllerのほかのaction, または異なるControllerで再利用できる点が利点としてあると思われます。今回のように1回だけなら利点無いですね…。
    * 同様の処理をまとめることでバグ発生や仕様変更で修正しなければならない箇所を減らせる、労力の削減になるのも利点かと思われます。
    * 抽出処理をController外におくことでControllerの肥大化を防いで可読性を良くし続けるのも利点になるかもしれません。

    あとは、そうですね、CakePHPにはbakeコマンドという便利なツールが用意されていますのでこれを利用するとModel, View, Controllerファイルが自動的に作成されます。
    http://book.cakephp.org/2.0/ja/console-and-shells/code-generation-with-bake.html

    初めから全てを理解するのは大変だと思われますので、雛形的なファイルを用いて行うことでだんだん覚えていけるのではないかなと思われます。

    キャンセル

0

デザインパターンの問題なのでいろいろな考え方があると思いますが、
以下の質問の答えが参考になれば幸いです。

https://teratail.com/questions/13294

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/31 16:13

    ご回答ありがとうございます。
    私の質問が悪かったかもしれません。

    デザインパターンの問題もありますが
    今回の場合におけるアソシエーションはどう設計したらいいのか?
    というのが主題でした。

    もちろん、IndexesController.php とせずにやる方法もあるかと思いますが、回答としていただきたいのは
    ・IndexesController.php を使う場合のアソシエーションの設計
    ・そもそも違う、正しい方法がある場合のアソシエーションの設計
    を求めています。

    キャンセル

0

ArticlesからSitesにbelongsToでアソシエーションすれば解決かと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

関連した質問

同じタグがついた質問を見る

  • PHP

    20877questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    6029questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • CakePHP

    2362questions

    CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。