3

もちろん、結果が部分的であるため、最初のテーブルの列では order_by を使用できますが、2 番目のテーブルの列では使用できません。

「結合」を使用すると、すべてが完璧に機能しますが、雄弁にこれを達成する必要があります。私は何か間違ったことをしていますか?

これは例です:

//with join
$data = DB::table('odt')
    ->join('hdt', 'odt.id', '=', 'hdt.odt_id')
    ->order_by('hdt.servicio')
    ->get(array('odt.odt as odt','hdt.servicio as servicio'));
foreach($data as $v){
    echo $v->odt.' - '.$v->servicio.'<br>'; 
}
echo '<br><br>';
//with eloquent
$data = Odt::get();
foreach($data as $odt){
    foreach($odt->hdt()->order_by('servicio')->get() as $hdt){
        echo $odt->odt.' - '.$hdt->servicio.'<br>';
    }
}
4

4 に答える 4

1

モデルでは、そのフィールドで並べ替える関係を明示的に指示する必要があります。

したがって、odtモデルにこれを追加します。

public function hdt() {
   return $this->has_many('hdt')->order_by('servicio', 'ASC');
}

これにより、このリレーションを使用するときに2番目のテーブルを並べ替えることができ、Fluent結合ステートメントにorder_by行は必要ありません。

于 2013-03-06T17:31:13.337 に答える
0

簡単な答えは次のとおりです。

$data = Odt::join('hdt', 'odt.id', '=', 'hdt.odt_id')
    ->order_by('hdt.servicio')
    ->get(array('odt.odt as odt','hdt.servicio as servicio'));

Fluentでできることはすべて、Eloquentでもできます。あなたの目標がhdts彼らのodtsthoで取得することである場合、私は読みやすさを改善するために逆クエリをお勧めします:

$data = Hdt::join('odt', 'odt.id', '=', 'hdt.odt_id')
    ->order_by('hdt.servicio')
    ->get(array('hdt.servicio as servicio', 'odt.odt as odt'));

これらは両方ともまったく同じです。

これが機能する理由を説明するには:

Whenever you call static methods like Posts::where(...), Eloquent will return a Fluent query for you, exactly the same as DB::table('posts')->where(...). This gives you flexibility to build whichever queries you like. Here's an example:

// Retrieves last 10 posts by Johnny within Laravel category
$posts = Posts::join('authors', 'authors.id', '=', 'posts.author_id')
    ->join('categories', 'categories.id', '=', 'posts.category_id')
    ->where('authors.username', '=', 'johnny')
    ->where('categories.name', '=', 'laravel')
    ->order_by('posts.created_at', 'DESC')
    ->take(10)
    ->get('posts.*');
于 2013-03-08T05:03:24.267 に答える
0

今、私はそれが何か単純なものだったことがわかります!2番目のテーブルでクエリを実行し、関数odt()witchを使用して最初のテーブルの内容を取得し、関係「belongs_to」を確立する必要があります。

//solution
$data = Hdt::order_by('servicio')->get();
foreach($data as $hdt){
    echo $hdt->odt->odt.' - '.$hdt->servicio.'<br>';
}
于 2013-03-08T01:30:07.663 に答える
0

codivist が提案したように、リレーショナル メソッドに order by を含めないことをお勧めします。あなたが敷設した方法は、機能的に共産主義者の提案と同じです。

2 つのソリューションの違いは、最初のソリューションでは、odt (すべての結果) を hdt.servicio で注文していることです。次に、odt を自然な順序で取得し、各 odt に含まれる hdt を servico で並べ替えます。

2 番目のソリューションも、1 つのクエリを作成してすべての odt をプルし、次に各 odt に対して追加のクエリを作成してその hdt をプルするため、効率が大幅に低下します。プロファイラーを確認します。最初のクエリと、1 つの列しか取得していないことを考えると、次のように機能しますか?

HDT::where( 'odt_id', '>', 0 )->order_by( 'servico' )->get('servico');
于 2013-03-07T18:59:12.757 に答える