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

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

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

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

Q&A

解決済

2回答

1554閲覧

cakephpのpaginateに関する質問

marimo.

総合スコア48

CakePHP

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

0グッド

0クリップ

投稿2016/01/16 11:43

cakephpについて勉強中のものです.

CakePHP

1public $paginate = [ 2 'Guest' => [ 3 'limit' => '10', 4 'order' => ['id' => 'asc'] 5 ] 6];

とpaginateをつかって表示すると

1 | hoge | 123@
1 | hoge | 123@
2 | fuga | 234@
3 | foo | 345@
3 | foo | 345@

のように出力されてしまいます.しかしguests tableでは


id | name | email

1 | hoge | 123@
2 | fuga | 234@
3 | foo | 345@

と格納されております.find('all')で持ってきた場合でもpaginateと同じような配列を返されました.
はじめからこの現象が起きていたわけではなく,アソシエーションを設定したあたりからおかしくなってきた気がしています.(でも具体的な原因がわからないため質問させていただきました)

アソシエーションはGuestモデル内で「$hasOne = AssociatePost」,AssociatePostモデル内で「$belongsTo = Post, Guest」,Postモデル内で「$hasOne = AssociatePost」としており,また,associate_posts table内にはpost_idとguest_idが入ってる状態です.

このpaginateはアソシエーションによるものなのでしょうか?
だいぶ自分でも迷走しているため,変な質問かとは思いますがよろしくお願い致します.

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

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

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

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

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

guest

回答2

0

ベストアンサー

テーブルの構成が記述されていないので想定ですが、guestsテーブルにはユーザが管理されていてPrimaryKeyにはユーザのインデックスが設定され、postsテーブルには投稿が管理されていてPrimaryKeyには投稿記事のインデックスが設定され、この2テーブルを結合させるためにassociate_postsがあり、post_idに対してguest_idが設定されているのだと思います。

この時、アソシエーションを設定した状態で、guestsテーブルの検索を行うと以下のように結合が設定されたSQLが発行されます。

SQL

1SELECT 2 `guests`.`guest_id`, 3 `guests`.`name`, 4 `guests`.`email`, 5 `AssociatePost`.`post_id`, 6 `AssociatePost`.`guest_id` 7FROM 8 `guests` AS `guests` 9 LEFT JOIN `test`.`associate_posts` AS `AssociatePost` ON 10 (`AssociatePost`.`guest_id` = `guests`.`guest_id`) WHERE 1 = 1 LIMIT 20

このSQLをそのまま実行してもらえば分かると思いますが、associate_postsに同一のguest_idで複数のレコードが登録されていると、その数文のレコードが検索結果として抽出されることになります。
提示された例では、guest_id=1およびguest_id=3のゲストはそれぞれ2つの投稿を行っていたため、そのような結果になったものと想定されます。
アソシエーションは、いろいろと自動でやってくれる分、裏側の処理を理解しないと使い方が難しいですね。

投稿2016/01/18 06:54

KatsumiTanaka

総合スコア924

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

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

0

Guestモデル内の$hasOne='AssociatePost'を消したら,解決しました.
ですが,なぜこれが回答になったのかは未だにわかりません.
回答をお待ちしております.

投稿2016/01/16 11:56

marimo.

総合スコア48

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問