0

次のように仮定します。

class List extends Model
{
    public function items(){
        return $this->hasMany(Items::class, 'c.class_id', 'class_id')
            ->rightjoin('items_classes as c', 'c.items_id', '=', 'items.id');
    }
}

問題は、Eloquentitemsが外部キー フィールドの前に追加し、最終的なクエリが次のようになることです。

SELECT * FROM items
RIGHT JOIN items_classes as c ON c.items_id = items.id
// here it is
WHERE items.c.class_id = 10

を使用してもDB::raw('c.class_id')問題は解決しませんでした。

4

1 に答える 1

1

hasMany関係メソッドの署名に気付いた場合:

return $this->hasMany(Model::class, 'foreign_key', 'local_key');

つまり、Laravel がクエリを作成するときに、2 番目の引数がdefined inforeign_keyの列と見なされます。tableModel::class

あなたのケースで単純化するには:

return $this->hasMany(Items::class, 'c.class_id', 'class_id')->...

rightjoin はちょっと置いておいて、Laravel はtablec.class_idの外部キーと考えていますが、Item::classこれは確かにitemstable です。

したがって、結果のクエリは次のとおりです。

SELECT * FROM items WHERE items.c.class_id = 10

次に、適切な結合を追加すると、laravel はメイン クエリに追加して次のようにします。

SELECT * FROM items
RIGHT JOIN items_classes as c ON c.items_id = items.id
WHERE items.c.class_id = 10

Model を に関連付けていて に関連付けていないため、 Laravel はitems_classesリレーションで参照しません。ListItem::classItemClass::class

必要なデータについてはわかりませんが、以下のように使用できるかどうかを確認してください。

class List extends Model
{
    public function items(){
        return $this->hasMany(Items::class, 'c.class_id', 'class_id');
    }

}


List::with(['items', function($q){

    return $q->->rightjoin('items_classes as c', 'c.items_id', '=', 'items.id');
}])->get();

これにより、リレーションシップを更新して目的のクエリを取得する方法がわかると思います。必要なテーブル構造とデータを追加すると、リレーションシップで回答を更新できます。

于 2019-02-20T11:30:06.887 に答える