0

私はこれについて何日も考えていて、理解できません(私はMVCとCIに比較的慣れていないため)。これが MVC の問題なのか、MySQL の問題なのか、配列の問題なのかさえわかりません。

状況: 2 つの MySQL テーブル

  1. テーブルデータ:id、title、list
  2. テーブルの: ID、名前

データテーブルをクエリすると、次のような配列が返されます (抜粋)。

[4] => Array
        (
            [id] => 3
            [title] => Foo                
            [list] => 1,2,3,4,6,14
        )

[5] => Array
        (
            [id] => 4
            [title] => Bar                
            [list] => 2,6,9,12
        )

フィールドリストには、次のようなテーブルのいくつかの ID に対応するカンマ区切りの値が含まれています

[3] => Array
            (
                [id] => 12
                [name] => 'value12'                
            )

各行でやろうとしていることは次のとおりです。

  • リスト値を取り、それを配列に分解します
  • テーブルからの結果セットを確認します(in_array() メソッド経由)
  • の場合、ID の名前の値を返します。
  • 何らかの方法でメインの結果セットに含めます(たとえば、2 次元配列として):

    [5] => 配列 ( [id] => 4 [タイトル] => バー [リスト] => 配列 ( [0] => 値6 [1] => 値12 ... ) )

これまでの私の素朴なアプローチは、

  • 2 つのテーブルのそれぞれに対してクエリを実行する
  • in_array を介して 2 つの結果セットを比較します

私の主な問題(モデル、コントローラー、ビューを厳密に分離しようとしている間):データテーブルの結果セットの「メインループ」に値テーブルの名前フィールドを含めるにはどうすればよいですか?

if($q->num_rows() > 0)
{
    $data[] = $q->result_array();
    foreach ($q->result() as $row)
    {
        $data[] = $row;
    }
    return $data;
}

次の(面倒な)アプローチを使用すると、毎回新しいアイテムを自然に取得します。

foreach ($q->result_array() as $row) 
{
    $data[]['id'] = $row['id'];
    $data[]['title'] = $row['title'];
    $data[]['list'] = $row['year'];
}

これは MySQL データベースであるため、SQL で (LIKE などを使用して) 爆発と比較を行う方法がわかりません。

情報ビットへの単純なリンクであっても、どんなヒントでも大歓迎です。

1兆ありがとう!

ファブ

4

1 に答える 1

1

リストとリスト値の間には多対多の関係があります。リレーショナル データベースでこれをモデル化する従来の方法は、結合テーブルを作成することです。したがって、スキーマを次のように構成します。

lists : list_id, title
values : value_id, name
list_values : list_id, value_id

list_valuesジョインテーブルです。リストと値をリンクします。

リストを作成するには、モデルに次の関数を含めることができます

function build_list($list_id)
{
    $list = $this->get_list($list_id);
    $list->values = $this->get_list_values($list_id);
    return $list;
}

function get_list($list_id)
{
    $sql = 'select * from lists where list_id=?';
    return $this->db->query($sql, array($list_id))->row();
}

function get_list_values($list_id)
{
    $sql = 'select v.value_id, v.name
        from list_values lv
        join values v on v.value_id=lv.value_id
        where lv.list_id=?';
    return $this->db->query($sql, array($list_id))->result();
}
于 2010-12-01T13:39:04.997 に答える