2015-08-14 1 views
0

Здравствуйте, я пытаюсь создать поиск в моем контроллере. Это мои модели:Выполните Расширенный Поиск - Поиск через отношения с детьми

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'; 

} 

У меня есть одно поле поиска, где пользователю разрешено вводить одно значение: enter image description here

В разрешенные параметры поиска являются: 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) 

На основании данных, возвращаемых я уже могу сказать, что этот запрос является неправильным, потому что даже когда имя я вошел не существует, она по-прежнему возвращает несколько строк.

Я хотел бы знать, что я делаю неправильно и как его исправить, и если этот способ является быстрым и эффективным.

ответ

0

Ну я думал, что через него и, наконец, пришел с этим, я пытался выяснить, как сделать это без Sing присоединяется, но похоже, что не может быть сделано так, должен был сделать это таким образом, вместо того, чтобы: