1

Ruby on Rails で数年前に行ったことを達成しようとしています。
現在、CodeIgniter 3.0.0 を使用しています。
私が達成したいことの概要の下に:

テーブル:

表: ユーザー 表: 記事
_________________ _____________________________________________________
| | ID | 名前 | | | ID | 説明 | バイヤー | 申請者 |
| | 1 | ジョン D. | | | 1 | PC マウス | 1 | 2 |
| | 2 | アニタ F. |          

私はこれを達成したい: (または同様のもの)

        配列
(
    [0] => stdClass オブジェクト
        (
            [id] => 1
            [説明] => 'PC マウス'
            [購入者] => stdClass オブジェクト
                (
                     [id] => 1
                     [名前] => 'ジョン D.'
                )
            [申請者] => stdClass オブジェクト
                (
                     [id] => 2
                     [名前] => 「アニタ F.」
                )
        )
)

だから私は呼び出すことができます:

echo $article->description; //=> PC マウス
echo $article->buyer->name; //=> ジョン D.
echo $article->applicant->name; //=> アニタ F.


私は(運なしで)試しました:

$this->db->from('articles');
$this->db->join('users', 'articles.buyer = users.id');
$this->db->join('users'.'articles.applicant = users.id');
$objects = $this->db->get()->result_object();

//=> スロー:
エラー 1066:
一意のテーブル/エイリアスではありません: 'users'
$this->db->from('articles');
$this->db->join('users', 'articles.buyer = users.id');
$objects = $this->db->get()->result_object();

//=> 'John D.' という値を持つ追加の列 'name' を返します。
        配列
(
    [0] => stdClass オブジェクト
        (
            [id] => 1
            [説明] => 'PC マウス'
            [バイヤー] => 1
            [申請者] => 2
            [名前] => 'ジョン D.'
         )
)

についてよく読んでいますgroup_byが、うまくいきません。
これを理解するのを手伝ってもらえますか?
これは解決策になるのでしょうか、それとも可能でしょうか?!

サイド情報

これは、私が必要とするものの簡略化された例です。もっとたくさんの結合があります。

これは私が最終的に持つべきものです:

購入には多くの記事があります (articles.purchasesID)
記事には 1 つのステータス (statusID) があります
記事には 1 つのブランド (brandID) があります
purchases には 1 人の購入者 (userID) がいます
購入には 1 人の申請者 (userID) があります
購入には 1 つのステータス (statusID) があります
購入には、delivered_to (userID) が 1 つあります
購入には 1 つのサプライヤー (suppliersID) があります
購入には 1 つの懸念があります (concernsID

// 記事のステータスをエコーし​​たい場合:
// Status には 'id' と 'name' があるので:
echo $purchase->article[0]->status->name //=> '処理中'

// または、製品の配送先を知りたい場合:
echo $purchase->delivered_to->name //=> 'Carsten'

あなたが私を助けてくれることを願っています!

4

1 に答える 1

1

複数の結合が機能しない理由は、エイリアス( source ) を指定する必要があるためです。結果が得られたら、それらを繰り返し処理して、オブジェクトを希望どおりに構築できるようにする必要があります。

  • ステップ 1:クエリを作成する

    $this->db->select('
        a.*,
        bu.name as buyer_name,
        au.name as applicant_name
    ');
    $this->db->from('articles a');
    $this->db->join('users bu', 'a.buyer = bu.id', 'left');
    $this->db->join('users au', 'a.applicant = au.id', 'left');
    $results = $this->db->get()->result();
    
  • ステップ 2:結果を繰り返し処理して目的のオブジェクトを構築する

    foreach ($results as $res) {
        $buyer_obj = new stdClass();
        $buyer_obj->id = $res->buyer;
        $buyer_obj->name = $res->buyer_name;
        $res->buyer = $buyer_obj;
        unset($res->buyer_name);
    
        $applicant_obj = new stdClass();
        $applicant_obj->id = $res->applicant;
        $applicant_obj->name = $res->applicant_name;
        $res->applicant = $applicant_obj;
        unset($res->applicant_name);
    }
    
  • ステップ 3:結果を確認する

    var_dump($results);
    

お役に立てれば :)

于 2015-08-04T17:39:53.590 に答える