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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

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

PHP

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

CakePHP

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

Q&A

解決済

3回答

2871閲覧

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

hogetail

総合スコア46

MySQL

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

PHP

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

CakePHP

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

0グッド

0クリップ

投稿2015/07/31 06:39

環境と現状

  • 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

php

1class IndexesController extends AppController { 2 3 public $uses = ['Article']; 4 5 public function index() { 6 $indexArticles = $this->Article->find('all', array( 7 'fieleds' => array('article_title', 'article_url', 'pub_date'), 8 'order' => array('pub_date' => 'desc'), 9 'limit' => 50 10 )); 11 12 $this->set('indexArticles', $indexArticles); 13 14 }
  • Model

  • View

    • Indexes/index.ctp

php

1<table> 2 <tr> 3 <th>更新時間</th> 4 <th>記事タイトル</th> 5 </tr> 6<?php 7 8foreach ($indexArticles as $data) { 9 $title = $data['Article']['article_title']; 10 $link = $data['Article']['article_url']; 11 $pub_date = $data['Article']['pub_date']; 12 13 echo '<tr>'; 14 echo '<td>'.$pub_date.'</td>'; 15 echo '<td><a href="'.$link.'" target="_blank">'.$title.'</a></td>'; 16 echo '</tr>'; 17} 18?> 19</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 でやりたい処理を書くのか、というのも理解していません。

是非、ご回答よろしくお願いします。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

こんにちは。

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

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

IndexesController.php:

php

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

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

index.ctp:

php

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

投稿2015/07/31 08:19

編集2015/07/31 09:30
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hogetail

2015/07/31 08:51

ご回答ありがとうございます。 > ※Sitesテーブルに対応しているSite Modelがあるものと仮定しています。 こちらは Model/Site.php に記述するものでしょうか? それとも Model/Index.php というファイルを作成して IndexesController.php で利用できるようにするのでしょうか? 根本的な理解がなっていないかもしれませんが、ご回答頂ければと。
退会済みユーザー

退会済みユーザー

2015/07/31 09:16

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

退会済みユーザー

2015/07/31 09:28 編集

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

2015/07/31 09:33

ご回答ありがとうございます。 現状では Model/Article.php も Model/Site.php も作成しておりませんでした。 理由は Model を作成しなくても IndexesController.php から articles テーブルから情報を find することができていたからです。 ですが、このやり方、考え方がそもそも間違っているのでしたらご指摘ください。 Model の扱いは今のところ、バリデーション、アソシエーション以外に使い道がわかっておりません。
退会済みユーザー

退会済みユーザー

2015/07/31 10:25 編集

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

0

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

投稿2015/07/31 08:23

yu-ri

総合スコア634

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

https://teratail.com/questions/13294

投稿2015/07/31 07:02

hotta

総合スコア1613

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hogetail

2015/07/31 07:13

ご回答ありがとうございます。 私の質問が悪かったかもしれません。 デザインパターンの問題もありますが 今回の場合におけるアソシエーションはどう設計したらいいのか? というのが主題でした。 もちろん、IndexesController.php とせずにやる方法もあるかと思いますが、回答としていただきたいのは ・IndexesController.php を使う場合のアソシエーションの設計 ・そもそも違う、正しい方法がある場合のアソシエーションの設計 を求めています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問