2

私がこのdbテーブルスキーマを持っていると仮定します:

id |      article          | slug
1    hey guys how are you?  hey-guys-how-are-you?

私は自分のdbルートフィールドを一意に保とうとしています

ルートは常にこのようにラクダ化されたメッセージフィールドですthis-is-a-title-but-now-is-a-route

したがって、同じルートを挿入すると、db error of duplicated key

では、常に一意のルートを制御して挿入するのはどちらが良い習慣ですか?

ありがとう

4

3 に答える 3

4

CodeIgniterにタグを付けたので、スラッグフィールドの値を事前に確認してから、必要に応じて値をインクリメントすることをお勧めします。CI文字列ヘルパーには、increment_stringそれを処理する関数があります。

increment_string()

文字列に数値を追加するか、数値を増やすことにより、文字列をインクリメントします。「コピー」やファイルを作成したり、固有のタイトルやスラッグを持つデータベースコンテンツを複製したりする場合に便利です。

使用例:

echo increment_string('file', '_'); // "file_1"
echo increment_string('file', '-', 2); // "file-2"
echo increment_string('file-4'); // "file-5"

それで

this-is-a-routeになりますthis-is-a-route-1

this-is-a-route-1になりますthis-is-a-route-2

于 2012-12-17T17:32:55.827 に答える
1

あなたはphpのuniqidを利用することができ、おそらくより多くのエントロピーを使ってあなたのために仕事をすることができます。

この関数の戻り値は常に同じ長さです。それ以外の場合は、23と13のエントロピーを使用します。したがって、スラッグを簡単にサブストラクションして、いつでも実際のものを取得できます。

于 2012-12-17T17:35:24.303 に答える
0

このメソッドは、存在しないものが見つかるまでスラッグをインクリメントするループを作成します。

モデル内:

public function create_slug($title) {
    $this->ci->load->helper('string');
    $this->ci->load->helper('url');

    $i = 1;
    $max = 10; 
    $slug = url_title($title, '-', TRUE);

    while($i <= $max && ($exist = $this->db->where('slug', $slug)->count_all_results('posts')) != 0) {
        $slug= increment_string($slug, '-');
        $i++;
    }

    //max was reached and the last slug is not unique
    if($i >= $max && $exist > 0) return FALSE;

    return $slug;
}
于 2012-12-17T23:08:09.123 に答える