Здравствуйте, я пытаюсь создать поиск в моем контроллере. Это мои модели:Выполните Расширенный Поиск - Поиск через отношения с детьми
Invoice.php
<?php namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Invoice extends Model
{
use SoftDeletes;
protected $dates = ['deleted_at'];
protected $table = 'invoices';
public function customerDetails() {
return $this->belongsTo('App\Models\CustomerDetails', 'customer_id');
}
public function tickets() {
return $this->hasMany('App\Models\Ticket', 'invoice_id');
}
}
CustomerDetails.php
<?php namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class CustomerDetails extends Model {
protected $table = 'customer_details';
public function user()
{
return $this->belongsTo('App\Models\User');
}
public function invoices() {
return $this->hasMany('App\Models\Invoices', 'customer_id');
}
}
Ticket.php
<?php namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Ticket extends Model {
protected $table = 'tickets';
}
У меня есть одно поле поиска, где пользователю разрешено вводить одно значение:
В разрешенные параметры поиска являются: Invoice ID, ID клиента, Имя, Фамилия, Email, Телефон, Reference ID, Дата покупки
Теперь то, что это должно сделать, это пойти в таблице счета и проверить, если введенное значение соответствует invoice_id или если введенное значение совпадает с customer_id или он соответствует customer_details-> first_name или customer_details-> last_name или customer_details-> Адрес электронной или customer_details-> телефон или REFERENCE_ID или created_at
Это то, что я пытался делать в контроллере:
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
$filter = Input::get('filter');
$invoices = "";
if (strlen($filter) > 0)
{
$invoices = Invoice::where('id', '=', $filter)
->orWhere(function ($query) use ($filter) {
$query->whereHas('customerDetails', function ($q) use ($filter) {
$q->where('id', '=', $filter)
->orWhere('first_name', '=', $filter)
->orWhere('last_name', '=', $filter);
});
})
->get();
}
else
{
$invoices = Invoice::with('customerDetails')
->whereRaw('created_at >= CURRENT_DATE')
->whereRaw('created_at < CURRENT_DATE + INTERVAL 1 DAY')
->get();
}
return [
'invoices' => $invoices
];
}
В моем коде выше я не добавил отношений на билеты пока я просто тестирование против customer_details первого.
Это Laravel запрос генерирует:
select * from `invoices` where `invoices`.`deleted_at` is null and `id` = 'Phil' or ((select count(*) from `customer_details` where `invoices`.`customer_id` = `customer_details`.`id` and `id` = 'Phil' or `first_name` = 'Phil' or `last_name` = 'Phil') >= 1)
На основании данных, возвращаемых я уже могу сказать, что этот запрос является неправильным, потому что даже когда имя я вошел не существует, она по-прежнему возвращает несколько строк.
Я хотел бы знать, что я делаю неправильно и как его исправить, и если этот способ является быстрым и эффективным.