• 締切済み

cakephpでの開発

初めまして、新人プログラマーです。 最近、cakeを使って開発をするプロジェクトに参加する事になったんですが、よく分からないので質問させて頂きます。 DBにある二つのテーブルから関連した情報を取得したいんですが、 1つ目は itemsテーブル id unit_price_code item_name item_code small_categories price 2つ目は unit_pricesテーブル id unit_price_code name created modefied という感じで2つの共通カラムはunit_pride_codeになります。 unit_pricesテーブルの各カラムは一意なんですが、itemテーブルに関してはunit_price_codeが同じものでitem_name、item_codeが違うものがあります。 取得したい項目はまず2つのテーブル共通のunit_price_codeをキーにしてitmesテーブルのitem_name、item_code、unit_priceテーブルのmodefiedとなります。 分かりにくい説明で申し訳ないんですが、ご回答宜しくお願いします(汗)

  • uuuhc
  • お礼率70% (7/10)
  • PHP
  • 回答数2
  • ありがとう数0

みんなの回答

  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.2

ANo.1の方が説明されていることの詳細は下記に載っています。 http://www.cakephp.jp/doc/ch06s04.html この項だけではなく他の項も目を通しておいた方がよいでしょう。

回答No.1

こんにちは 検証してないですがこれでいけるような。 これ以外にも何通りかやり方ありますがこれが簡単かとー /models/unit_price.php class UnitPrice extends AppModel{ public $hasMany = array('Item'=> array('conditions'=>'UnitPrice.unit_price_code = Item.unit_price_code ')); } コントローラーで、 function xxxx() $options = array('conditions'=>array('unit_price_code'=>$unitPriceCode)); var_dump($this->UnitPrice->find('all',$options)); } で、いけるような予感(゜A゜)

参考URL:
http://book.cakephp.org/ja/view/78/関連-モデルを結びつける

関連するQ&A

  • データベース ー どういうテーブル構造にしますか?

    管理者テーブル table admin admin int, adm_name text 商品テーブル table items item_id int, item_name text, item_price int と2つのデータテーブルがあった場合に 、誰がいつどんな変更をしたかを記録を取りたい場合、あなたならどういうふうに作りますか? itemsテーブルにカラムを増やしますか? 別テーブルでログ用のテーブルを増やしますか?

  • 一度に関連する他のテーブルの行も取得したい

    MySQLバージョン4.1.16を使用しています。 ちょっとPHPも絡んでくるのですが、こちらのジャンルでお願いします。 テーブル「items」はテーブル「users」のuser_idカラムを 外部キーとして持っています。ここで「users」テーブルの行を取得して、 その値(user_idのaaaaやbbbbなど)を利用して 「items」テーブルのそれぞれ対応する行を取得したいのですが、 $users = (usersテーブルの行を取得するSQL文); $index = 0; foreach ($users as $row) { $users[$index]['items'] = (user_idに対応したitemsテーブルの行を取得するSQL文); $index++; } print_r($users); /* Array (  [0] => Array   (    [user_id] => aaaa    [items] => Array     (      [0] => Array       (        [user_id] => aaaa        [item_name] => アイテム1       )      [1] => Array       (        [user_id] => aaaa        [item_name] => アイテム2       )     )   )  [1] => Array   (    [user_id] => bbbb    [items] => Array     (      [0] => Array       (        [user_id] => bbbb        [item_name] => アイテム3       )     )   ) ) */ と、このように2段階に分けてやれば取得できるのですが、 そうではなくてこれを一度に取得できるSQL文というかやり方はあるのでしょうか? $users = (usersテーブルの行を取得するSQL文);←この段階でそれぞれ対応してるitemsテーブルの行まで取得したい

  • CakePHP テーブル名カラム名の規約について

    CakePHP初心者です。 product(商品) product_category(商品カテゴリ) と言うテーブルがあったとします。 それぞれには、主キーと名称(商品名/商品カテゴリ名)を持つとします。 更に、productにはproduct_categoryの外部キーを持つとします。 これらを規約に合わせると、 // テーブル名 products product_categories // products のカラム id(PK) product_name product_category_id(FK) // product_categories のカラム id(PK) product_category_name に、なると思います。 ここで質問なのですが、カラムの product_name と product_category_name は、 productName と productCategoryName のように、 キャメルケースにする事は、何か問題がありますでしょうか? (主キーや外部キーにならないカラムであっても、 アンダースコア区切りにしないと、不具合やデメリットがあるのでしょうか?) どうぞ、よろしくお願いいたします。

    • 締切済み
    • PHP
  • ランキング機能の実装

    group byを使って、詳細テーブルを集計してランキング表示するためのSElECT文を作成しています。購入数の多い順に商品を表示させるには、以下のSQL文をどのように修正すればいいですか? $sql = " SELECT details.item_id, details.price, details.amount SUM(details.price * details.amount) AS total, items.name FROM details JOIN items ON details.item_id = items.item_id GROUP BY details.item_id, details.price, details.amount, items.name ORDER BY amount ";

    • 締切済み
    • PHP
  • PHP5でxml文書をパースする方法

    <?xml version="1.0"?> <root> <items>  <item>   <id>1</id>   <name>商品(赤)</name>   <price>1500</price>   <color>red</color>   <size>8</size>   <option>A</option>  </item>  <item>   <id>2</id>   <name>商品(青)</name>   <price>700</price>   <color>blue</color>   <size>3</size>  </item>  <item>   <id>3</id>   <name>商品(緑)</name>   <price>1200</price>   <color>green</color>   <size>5</size>   <option>C</option>  </item> </items> </root> 上記のようなXMLデータをPHPでパースし、 1つずつ、配列に入れていきたいと考えていますが、 問題なのは、 上から2番目の商品(青)には、<option>データが無いということです。 これは、この<option>が、オプションが有る時にだけ存在するタグだからです。 //----------------------------- <?php $doc->load($url); //上記xmlデータのあるURL:$url $array = array(); $i = 1; while($i <= 3){  //実際には、もっと商品数はあります。ここでは例として、3。  //配列の初期化  $item_array = array();  $items = $doc->getElementsByTagName('id');  $item_array['id'] = $items->item($i)->nodeValue;  $items = $doc->getElementsByTagName('name');  $item_array['name'] = $items->item($i)->nodeValue;  //*  //*同様のコードが続く  //*  $items = $doc->getElementsByTagName('option');  $item_array['option'] = $items->item($i)->nodeValue;  //*  //*同様のコードが続く  //*  //商品データが詰まった配列を、さらに配列に入れる  $array[] = $item_array; } //全ての商品のデータが詰まった配列を表示する。 print_r($array); ?> //----------------------------- このようなことがしたいわけです。 なお、タグ名を$tag_array = array('id','name',,,,,'option',,,)として、 foreach($tag_array as $tag){  $items = $doc->getElementsByTagName($tag);  $item_array[$tag] = $items->item($i)->nodeValue; } という風にした方が冗長ではないかとは思いますが、 それは、まぁ横に置いておきまして、 このコードで問題なのは、<option>が途中、つまり2番目で抜けると、 3番目の<option>データが、2番目の商品の<option>データとして配列に入ってしまうことです。 上から順に詰めて、配列に格納されてしまい、困っている、ということです。 <option>データが無い場合は、「ナシ」とでもしておきたいのですが、 どうしたら良いでしょうか? <item>を1つずつ   $items = $doc->getElementsByTagName('item'); で取得して、 各<item>の中の、<option>にアクセスする、なんて方法があるとベストなのですが、 そんな方法はありますでしょうか? firstChildですと、<item>の場合、<id>になってしまうため、<option>にはアクセスできません。 firstChild以降のChildには、どうやってアクセスしたら良いのでしょうね? どなたか、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 2つのSQL文で結果に差違が発生する

    私の知識ではお手上げのため、ご教授願いたいのですが、 下記のようなテーブルが仮にあったとして、レコードがそれぞれいくつか入っています。 【itemsテーブル】   id・・・・・連番   cat_id・・・category.id   price ・・・価格   max_num ・・セット数   date・・・・発売日 【categioryテーブル】   id・・・・・連番   cat_name・・カテゴリ名 【orderテーブル】   id・・・・・連番   item_id ・・items.id   paid_price・支払価格 以下の2つのSQL文を実行させた場合、「total_price」の値に違いは発生しますか? 【SQL文 A】----------------------------- SELECT items.cat_id, `category`.`cat_name`, SUM(`items`.`price` * `items`.`max_num`) AS `total_price`, SUM(IF(`order`.`paid_price` > 0, `order`.`paid_price`, 0)) AS `total_paid`, SUM(IF(`order`.`paid_price` = 0 , `items`.`price`, 0)) AS `not_payment` FROM `items` INNER JOIN `category` ON (`items`.`cat_id` = `category`.`id`) INNER JOIN `order` ON (`items`.`id` = `order`.`item_id`) WHERE DATE_FORMAT(`items`.`date`, '%Y%m') = 201511 GROUP BY `items`.`cat_id` ORDER BY `items`.`cat_id` ASC ------------------------------------ 【SQL文 B】----------------------------- SELECT items.cat_id, `category`.`cat_name`, SUM(`items`.`price` * `items`.`max_num`) AS `total_price` FROM `items` INNER JOIN `category` ON (`items`.`cat_id` = `category`.`id`) WHERE AND DATE_FORMAT(`items`.`date`, '%Y%m') = 201511 GROUP BY `items`.`cat_id` ORDER BY `items`.`cat_id` ASC ------------------------------------ こちらで上記と同じようなSQL文を実行すると、Bで出てほしい値がAでは出てこないのです。 Aの場合は「WHERE DATE_FORMAT(`items`.`date`, '%Y%m') = 201511」が抽出条件として実行されていないような感じです。 すべてのレコードの「SUM(`items`.`price` * `items`.`max_num`) AS `total_price`」が計算されています。 Bだけで実行すればちゃんとほしい値が返ってきます。 何か間違っていますか?

    • ベストアンサー
    • MySQL
  • 2つのテーブルにあるIDを1つのID(item_id)?にしたいです。

    2つのテーブルにあるIDを1つのID(item_id)?にしたいです。 このやり方は間違ってますか? ご指摘よろしくお願いします。 車テーブル car_id name  maker price 1   スープラ トヨタ 100 2   スカイライン 日産 100 食べ物テーブル food_id name price 1 リンゴ 100 2   バナナ 100 アイテムテーブル item_id car_id(外) food_id(外) 1 1 NULL 2 2 NULL 3 NULL 1 4 NULL 2

  • データがない場合のクエリの書き方

    いつもお世話になっております。 MySQLとPHPで開発をしております。 以下のような3つのテーブルがあります。 テーブル:Hp(キー:hid) |hid |name |・・・| +---------------------+ |1  |a_name|・・・| |2  |b_name|・・・| テーブル:items(キー:item_id) |item_id|item|alias|type|・・・| +----------------------------------+ |1   |aa |aaaaa|11 |・・・| |2   |bb |bbbbb|11 |・・・| |3   |cc |ccccc|11 |・・・| |4   |dd |ddddd|22 |・・・| |5   |ee |eeeee|22 |・・・| テーブル:check(キー:hid, item_id ) |hid|item_id|・・・| +-------------------+ |1 |1   |・・・| |1 |2   |・・・| |1 |3   |・・・| |2 |1   |・・・| |2 |3   |・・・| |2 |5   |・・・| check に登録されていない item_id を表示したいと考えているのですが データの取得方法がわかりません。 例えば hid=1 の場合、item_id=4 と item_id=5 を取得したいです。 下記クエリの場合、hid に関係なく取得できてしまいます。 select i.* from items i left join check c using(item_id) where i.type='11' and c.item_id is NULL order by i.item_id ASC どうやってクエリを書いたらよろしいでしょうか。 ご教示お願いいたします。 <環境> MySQL:4.1.20

    • ベストアンサー
    • PHP
  • SELECTした値でUPDATEしたいのですが

    <前提> ■oldテーブル ・idカラム ・createdカラム ・modifiedカラム ・その他色々カラム ■newテーブル ・idカラム ・createdカラム ・modifiedカラム ・その他色々カラム <やりたいこと> 両テーブルのidが一致するとき、 newテーブルの「created」「modified」カラムの値で、oldテーブルの同カラムを上書きしたい SQL文を教えてください

    • ベストアンサー
    • MySQL
  • phpでのSQLでのデータの追加方法

    phpでのSQL実行に関して、下記のデータを追加するコードがあります。 mysql_query('INSERT INTO my_items SET maker_id=1, item_name="もも", price=210, keyword="缶詰,ピンク,甘い", sales=0, created="2010-08-01", modified="2010-08-01"') or die(mysql_error()); echo 'データを挿入しました'; 私は。それを INSERT INTO (フィールド名) VALUES(値) のSQL文で実行したいのですが、その方法が分かりません。 よろしければ、それを実行するコードを教えてください。お願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう