0

こんにちは、私は Cakephp を初めて使用し、cakephp 2.3.4 でプロジェクトを行っています。
has many through association を介して、製品の金属クラスを関連付ける必要があります。しかし、それは機能していないようです。

型式コード

class Metal extends AppModel {
public $hasMany = array(
  'MetalProduct'
 );
}

class Product extends AppModel {
public $hasMany = array(
  'MetalProduct'
 );
}

App::uses('AppModel', 'Model');

class MetalProduct extends AppModel {

public $belongsTo = array(
    'Metal' => array(
        'className'    => 'Metal',
        'foreignKey'   => 'metal_id'
    ),
   'Product' => array(
        'className'    => 'Product',
        'foreignKey'   => 'product_id'
    )
);}

データベースのテーブル名はmetalproducts、およびmetal_products です

複数の金属タイプを選択するための複数選択オプションがあります。
これは、金属のリストを取得する方法です

     $metals=$this->Metal->find('list');
    $this->set(compact('metals'));

リストボックスの FormHelper コードは

    <?php echo $this->Form->input('Metal',array('type' => 'select', 
                                                'multiple' => true)); ?>

製品は正常に保存されていますが、関連付けは保存されていません。
デバッグ配列は私にこれを与えます

    $message = array(
'Product' => array(
    'category_id' => '517a514b-0eb0-4ec9-b018-0b948620d4f0',
    'name' => 'mangalsutra Diamond',
    'slug' => 'mangalsutra_diamond',
    'description' => '1212',
    'Metal' => array(
        (int) 0 => '5183cb65-bf90-459c-b22e-0b748620d4f0',
        (int) 1 => '5183ce25-c744-433e-b035-0b748620d4f0'
    ),
    'image' => '121212',
    'price' => '12121',
    'weight' => '12',
    'active' => '1',
    'category' => 'Mangalsutra'
)
 )

私は頭を壁に突き刺しましたが、なぜ協会が救われないのか見当がつきませんでした。彼らがチュートリアルで言う方法は簡単に思えますが、なぜうまくいかないのでしょうか?

金属配列がこのように渡されるため、保存されないのではないかと疑っています

    'Metal' => array(
        (int) 0 => '5183cb65-bf90-459c-b22e-0b748620d4f0',
        (int) 1 => '5183ce25-c744-433e-b035-0b748620d4f0'
    ),

(int) 0 などではなく、「id」に言及する必要があります。

また、手動で作成した metal_products のデータベース テーブルには、

  id(primary key)
  metal_id(foreign key to Metal.id)
  product_id(foreign key to Product.id)

命名規則やデータベースの作成方法に何か問題がありますか? 私が他の人から試したものは何でも答えがうまくいかないので、正しい答えを教えてください

経由で保存しています

     $this->Product->saveAll($this->request->data, array('deep' => true))
4

2 に答える 2

0

あなたのモデルでは、そのすべてが MetalProduct モデルにありますか? だったら引っ越せばいい

class Metal extends AppModel {
public $hasMany = array(
  'MetalProduct'
 );
}

メタルモデルと

class Product extends AppModel {
public $hasMany = array(
  'MetalProduct'
 );
}

製品モデルへ

また、各モデルに属しを追加します

結合テーブルがあることがわかりました。通常、結合テーブルは HABTM 関連付け用です。これは HasMany です。上記のように、各モデルで外部キー関係を定義するには、利用可能な他のオプションを使用する必要があります。

Cake Documentation の例を参照してください。

http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html

また、モデルを正しく設定する方法がわからない場合は、常に Cakephp の Bake 機能を使用してモデルとコードを生成できます。

book.cakephp.org/2.0/en/console-and-shells/code-generation-with-bake.html

あなたがより視覚的な学習者である場合、このビデオtutは基本を理解するのに役立ちます

http://www.youtube.com/watch?v=kJAMifqF5s8

于 2013-05-08T15:44:06.050 に答える
0

Bake を使用して生成した関係は、次のようになります

class Product extends AppModel {

 /**
 * hasAndBelongsToMany associations
 */
public $hasAndBelongsToMany = array(
    'Metal' => array(
        'className' => 'Metal',
        'joinTable' => 'metals_products',
        'foreignKey' => 'product_id',
        'associationForeignKey' => 'metal_id',
        'unique' => 'keepExisting',
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
    ));
}

 class Metal extends AppModel {
 /** hasAndBelongsToMany associations */
public $hasAndBelongsToMany = array(
    'Product' => array(
        'className' => 'Product',
        'joinTable' => 'metals_products',
        'foreignKey' => 'metal_id',
        'associationForeignKey' => 'product_id',
        'unique' => 'keepExisting',
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
    ));
  }

 /**
  * MetalsProduct Model
  * @property Product $Product
  * @property Metal $Metal
  */
  class MetalsProduct extends AppModel {
  /* belongsTo associations */
public $belongsTo = array(
    'Product' => array(
        'className' => 'Product',
        'foreignKey' => 'product_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
    'Metal' => array(
        'className' => 'Metal',
        'foreignKey' => 'metal_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ));
   }

これは私にとって完璧に機能しました。それがすべての人に役立つことを願っています。

于 2013-05-15T14:32:55.247 に答える