2017-03-08 1 views
1

ich Probleme reproduzieren diese Art von einer MySQL-AbfrageKonvertieren MySQL Suche nach einem Paar von Werten in einer Tabelle Eloquent Abfrage

SELECT * 
    FROM foo 
    WHERE (column1, column2) IN (('foo', 1), ('bar', 2)) 

Es ist ein Verfahren, bei Eloquent Query Builder mit Eloquent whereIn(), aber es genannt habe nur eine Spalte als Parameter empfangen kann:

/** 
* Add a "where in" clause to the query. 
* 
* @param string $column 
* @param mixed $values 
* @param string $boolean 
* @param bool $not 
* @return $this 
*/ 
public function whereIn($column, $values, $boolean = 'and', $not = false) 
{ 
    ... 
} 

so können Sie so etwas wie dieses

$qb = $this->model->whereIn(['column1', 'column2'], array([1, 2], [1,3], [3, 32])); 
nicht tun

Zur Zeit arbeite ich sehr hart versucht Lösung zu finden, aber wenn jemand helfen kann, wäre ich sehr dankbar :)

EDIT: Ich schaffte es auf diese Weise zu tun:

/** 
* ... 
*/ 
public function findConnectionsByUser(User $user, array $userConnectionIds) 
{ 
    $qb = $this->model->query(); 

    ... 

    return $this->createQueryBuilderForUserConnectionsWithUserIds($qb, $user, $userConnectionIds)->get(); 
} 

/** 
* @param Builder $qb 
* @param User $user 
* @param array $userConnectionIds 
* 
* @return Builder 
*/ 
private function createQueryBuilderForUserConnectionsWithUserIds(Builder $qb, User $user, array $userConnectionIds) 
{ 
    foreach ($userConnectionIds as $userConnectionId) { 
     $qb->orWhere(array(
      array('receiver_id', $user->id), 
      array('initiator_id', $userConnectionId) 
     )) 
      ->orWhere([ 
       ['receiver_id', $userConnectionId], 
       ['initiator_id', $user->id] 
      ]); 
    } 

    return $qb; 
} 

EDIT 2 (mehr skalierbare Lösung):

$qb = $this->model->query(); 
$oneSide = $this->model->newQuery()->where('receiver_id', '=', $user->id) 
      ->whereIn('initiator_id', $userConnectionsIds); 

return $qb->where('initiator_id', '=', $user->id) 
      ->whereIn('receiver_id', $userConnectionsIds) 
     ->union($oneSide)->get(); 

Antwort

2

können Sie nisten versuchen, sie wie

$qb = $this->model->whereIn('column1', [1, 2, 3]) 
->orWhere(function ($query) { 
    $query->whereIn('column2', [2, 3, 32]); 
}); 

auch nicht sicher, ob man einfach wie diese bei nutzen könnten. Probieren Sie zuerst

$qb = $this->model->whereIn('column1', [1, 2, 3]) 
->whereIn('column2', [2, 3, 32]); 

Die erste Abfrage liest sich eher wie OR und die zweite eher wie eine AND Abfrage.

+0

Ich habe es geschafft, mein Problem zu lösen, bevor ich deine Antwort sah. Aber für kleine Test, habe ich Ihren Code für meine Zwecke angepasst, und es scheint zu funktionieren, Tnx! –

0

Es ist ein bisschen grob, aber man konnte die Spalten ein, trennt die beide mit einigem ansonsten ungenutzten Charakter wie verketten ‚|‘.

+0

Hmm .. Ich glaube nicht, dass dies helfen könnte. –

Verwandte Themen