2015-02-18 16 views
14

tôi có một nhiệm vụ - thêm vào tìm kiếm mô hình tìm kiếm theo tên đầy đủ. Họ và tên là họ + tên. Vì vậy, tôi cần phải xây dựng truy vấn nhưyii2 Bộ lọc 'OR LIKE' của ActiveQuery

WHERE first_name LIKE '%var%' OR last_name LIKE '%var%' 

Cách duy nhất tôi có thể làm điều đó:

$query->andFilterWhere([ 
'OR', 
'profiles.first_name LIKE "%' . $this->userFullName . '%" ', 
'profiles.last_name LIKE "%' . $this->userFullName . '%"' 
]); 

Nhưng tôi không thích nó bởi vì% không an toàn của nó. Tôi không biết làm thế nào ... Tôi nghĩ rằng đó là cách để xây dựng truy vấn như vậy với người xây dựng hoạt động yii2, và tôi muốn để có được kết quả trong smth như

$query->andFilterWhere(['LIKE', 'profiles.first_name', $this->userFullName]); 
$query->andFilterWhere(['OR LIKE', 'profiles.last_name', $this->userFullName]); 

Vấn đề là trong truy vấn Giống như, tôi có thể sử dụng mảng như các giá trị mà thuộc tính sẽ được comapred nhưng tôi không thể sử dụng mảng như danh sách các thuộc tính được so sánh với.

hoặc

$subQuery1 = Profile::find()->Where(['LIKE', 'profiles.first_name', $this->userFullName]); 
$subQuery2 = Profile::find()->Where(['LIKE', 'profiles.last_name', $this->userFullName]); 
//i think its overloaded(3 queries insteadof 1 but still) and the final query 
$query->andFilterWhere([ 
'OR', 
$subQuery1, 
$subQuery2 
]); 

Bất kỳ ý tưởng làm thế nào để xây dựng truy vấn whithout "%"?

Trả lời

37

Bạn chỉ nên thử:

$query->andFilterWhere([ 
    'or', 
    ['like', 'profiles.first_name', $this->userFullName], 
    ['like', 'profiles.last_name', $this->userFullName], 
]); 

or: tương tự như các nhà điều hành and ngoại trừ các toán hạng được nối bằng OR. Ví dụ: ['or', ['type' => [7, 8, 9]], ['id' => [1, 2, 3]] sẽ tạo ra (type IN (7, 8, 9) OR (id IN (1, 2, 3))).

Read more: http://www.yiiframework.com/doc-2.0/yii-db-queryinterface.html#where()-detail

+0

là nó hoạt động? Tôi không thể kiểm tra vì đã rời khỏi công việc, nhưng nếu công trình của nó thx rất nhiều. :) –

+0

nó giúp - yii của nó một magick –

+1

làm thế nào để tìm giá trị bằng dấu phẩy bằng cách sử dụng FIND_IN_SET? –

Các vấn đề liên quan