フォーラムへの返信

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • フォーラム: 使い方全般
    返信が含まれるトピック: single.phpとsingle-hoge.phpで条件分岐

    カスタム投稿タイプはis_singular()だったと思います。

    <?php if(is_single()): ?>
    内容1
    <?php elseif(is_singular('hoge')): ?>
    内容2
    <?php else: ?>
    内容3
    <?php endif; ?>
    フォーラム: 使い方全般
    返信が含まれるトピック: ALTER TABLEが大量に実行されてしまう
    トピック投稿者 itakuraikura

    (@itakuraikura)

    たしかにそうですね。
    手掛かりの少ない中でご回答ありがとうございました。
    大変勉強になりました。

    フォーラム: 使い方全般
    返信が含まれるトピック: ALTER TABLEが大量に実行されてしまう
    トピック投稿者 itakuraikura

    (@itakuraikura)

    >wp_kindsテーブルが作成されたときにADD FOREIGN KEYすれば良い

    なるほど!わかったかもしれません。
    つまり下記34行目(#ここでwp_yasaiテーブルにFKを追加(※1)のコメントの次の行)でFKをセットするという感じであっていますか?

    // wp_yasaiテーブル作成
    my_create_table('yasai');
    function my_create_table( $table_name ) {
    	global $wpdb;
    	require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    
    	$sql = "CREATE TABLE " . $wpdb->prefix . $table_name . "(		
    		post_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT
    		,kind_id INT(2) UNSIGNED NOT NULL
    		,content VARCHAR(10) 
    		,PRIMARY KEY (post_id)
    		#kindsテーブルのCREATEが終わってから下記を実行するのでここではコメントアウト(※1)
    		#,FOREIGN KEY (kind_id) REFERENCES wp_kinds(kind_id)	
    	);";
    	add_option($table_name."_version", '1.0');
    	dbDelta($sql);
    }
    
    // wp_kindsテーブル作成
    my_create_table('kinds');
    fnction my_create_table( $table_name ) {
    	global $wpdb;
    	require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    
    	$sql = "CREATE TABLE " . $wpdb->prefix . $table_name . "(		
    		kind_id INT(2) UNSIGNED NOT NULL AUTO_INCREMENT
    		,kind    VARCHAR(10) 
    		,PRIMARY KEY (kind_id)	
    	);";
    	add_option($table_name."_version", '1.0');
    	dbDelta($sql);
    	
    	#ここでwp_yasaiテーブルにFKを追加(※1)
    	my_add_fk( 'wp_yasai', 'kind_id', 'wp_kinds', 'kind_id' );
    }
    
    // 外部キー追加
    function my_add_fk($child_table, $child_col, $parent_table, $parent_col){
    	global $wpdb;
    	$wpdb->query("ALTER TABLE $child_table ADD FOREIGN KEY($child_col) REFERENCES $parent_table($parent_col)");
    }
    

    できれば教えて頂きたいのですが、@munyagu 様もこのようにしますか?
    自分なりに12行目のコメントアウトで「FKを別のタイミングで設定します」ということを伝えているつもりですが、やはりタイミングが別だとわかりにくいというか…、でも仕方ないですもんね。何かわかりやすい方法があればいいのですが。

    フォーラム: 使い方全般
    返信が含まれるトピック: ALTER TABLEが大量に実行されてしまう
    トピック投稿者 itakuraikura

    (@itakuraikura)

    以下のように「FKが設定されていなければ」という条件でもあればと思っているのですが、なかなか検索しても見つけられません…

    function my_add_fk($child_table, $child_col, $parent_table, $parent_col){
    	global $wpdb;
    	if( 「FKが設定されていなければ」 ){
    		$wpdb->query("ALTER TABLE $child_table ADD FOREIGN KEY($child_col) REFERENCES $parent_table($parent_col)");
    	}
    }
    フォーラム: 使い方全般
    返信が含まれるトピック: ALTER TABLEが大量に実行されてしまう
    トピック投稿者 itakuraikura

    (@itakuraikura)

    また複数がいくつになるかの法則を見つけまして、my_create_table()で設定したカラムの数だけFKが追加される、といった法則でした。

    つまり以下のようにカラムが3つあればFKは3ついった流れです。

    まずは【A1】を実行し、SHOW CREATE TABLE wp_yasai;を実行
    ↓ 結果

    'CREATE TABLE'wp_yasai' (
     'post_id' bigint(20) unsigned NOT NULL AUTO_INCREMENT,
     'kind_id' int(2) unsigned NOT NULL,
     'content' varchar(10) DEFAULT NULL,
     PRIMARY KEY ('post_id')
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8'

    そして【A2】を実行し 、SHOW CREATE TABLE wp_yasai;を実行
    ↓ 結果

    'CREATE TABLE'wp_yasai' (
     'post_id' bigint(20) unsigned NOT NULL AUTO_INCREMENT,
     'kind_id' int(2) unsigned NOT NULL,
     'content' varchar(10) DEFAULT NULL,
     PRIMARY KEY ('post_id'),
     KEY 'kind_id' ('kind_id'),
     CONSTRAINT 'wp_yasai_ibfk_1' FOREIGN KEY ('kind_id') REFERENCES 'wp_kinds' ('kind_id'),
     CONSTRAINT 'wp_yasai_ibfk_2' FOREIGN KEY ('kind_id') REFERENCES 'wp_kinds' ('kind_id'),
     CONSTRAINT 'wp_yasai_ibfk_3' FOREIGN KEY ('kind_id') REFERENCES 'wp_kinds' ('kind_id')
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8'

    ご覧のようにwp_yasai_ibfk_1wp_yasai_ibfk_2wp_yasai_ibfk_3という3つのFKになってしまうのです

    (尚こちらの入力フォームの事情により、上記の結果はバッククオートをアポストロフィーに変換しています。)

    フォーラム: 使い方全般
    返信が含まれるトピック: ALTER TABLEが大量に実行されてしまう
    トピック投稿者 itakuraikura

    (@itakuraikura)

    こんにちは
    いつもお世話になっております

    >両方のテーブルが2つとも作られた時点で1度だけ ADD FOREIGN KEY すればいいんじゃないでしょうか。

    とのことですが、どのようにすればできますか?次の【A1】と【A2】の二回を、【B1】の一回に変更する、という意味ではないですよね?

    質問では下記【A1】と【A2】という二回のステップに分けてやっていまして、

    【A1】 my_add_fk()をコメントアウトし、my_create_table()を書いた状態でサイトを読み込みテーブル作成を実行
    【A2】my_create_table()をコメントアウトし、my_add_fk()を書いた状態でサイトを読み込みFK設定を実行

    アドバイスを受けて下記【B1】の一回だけにしてみたのですが、やはりFKは複数入ってしまいました。

    【B1】 my_add_fk()とmy_create_table()を書いた状態でサイトを読み込みテーブル作成とFK設定を実行

    フォーラム: 使い方全般
    返信が含まれるトピック: ストレージエンジンの確認方法
    トピック投稿者 itakuraikura

    (@itakuraikura)

    なるほどもう少し調べてみます。ありがとうございます。

7件の返信を表示中 - 1 - 7件目 (全7件中)