Laravel где ('user_id') кажется полностью игнорируемым - PullRequest
0 голосов
/ 12 ноября 2018

У меня проблема, когда Laravels Eloquent ORM полностью игнорирует user_id.

Голуби Стол
id user_id name father_id mother_id ringnumber gender color created_at updated_at landcode
(это мои столбцы (если кто-то знает, как лучше отформатировать это, дайте мне знать))

У меня есть поиск, из которого маршрутизируется поисковый параметр q в мой SearchController.php, в котором эта функция живет:

namespace App\Http\Controllers;

use App\Pigeon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Input;

class SearchController extends Controller
{
    public function index()
    {
        $q = Input::get('query');

        $userId = Auth::user()->id;

        $pigeons = Pigeon::where([
                ['user_id', '=', $userId],
                ['name','LIKE','%'.$q.'%']
            ])
            ->orWhere('ringnumber','LIKE','%'.$q.'%')
            ->sortable()
            ->paginate(15);
        dd($pigeons);

        return view('backend.pigeon.pigeonlist')->with('pigeons', $pigeons);
    }
}

По какой-то причине этот построитель запросов Eloquent полностью игнорирует 'user_id', '=', $userId, и это важная часть, потому что я хочу искать голубей только для текущего вошедшего в систему пользователя.

Ниже приведен результат такого запроса, проблема в том, что существуют голуби со всеми видами user_id, а не только один пользователь, который их искал.

LengthAwarePaginator {#259 ▼
    #total: 150
    #lastPage: 10
    #items: Collection {#267 ▼
      #items: array:15 [▼
        0 => Pigeon {#268 ▶}
        1 => Pigeon {#269 ▶}
        2 => Pigeon {#270 ▶}
        3 => Pigeon {#271 ▶}
        4 => Pigeon {#272 ▶}
        5 => Pigeon {#273 ▶}
        6 => Pigeon {#274 ▶}
        7 => Pigeon {#275 ▶}
        8 => Pigeon {#276 ▶}
        9 => Pigeon {#277 ▶}
        10 => Pigeon {#278 ▶}
        11 => Pigeon {#279 ▶}
        12 => Pigeon {#280 ▶}
        13 => Pigeon {#281 ▶}
        14 => Pigeon {#282 ▶}
      ]
    }
    #perPage: 15
    #currentPage: 1
    #path: "http://mywebsite.test/pigeon/search"
    #query: []
    #fragment: null
    #pageName: "page"
    +onEachSide: 3
  }

Небольшое примечание, я получил некоторую информацию отсюда: Как создать множественный запрос where, используя Laravel Eloquent?

Проблема решена: Сначала у меня был orWhere, который отверг «где», так что это было довольно глупо с моей стороны. Во-вторых, моя настоящая проблема заключалась в том, что я пытался получить только записи для текущего вошедшего в систему пользователя, который работает через этот код:

$pigeons = Pigeon::where('user_id', \Auth::id())
                ->where(function($query) use ($q) {
                    $query->where('name', 'LIKE', '%'. $q .'%');
                })
                ->sortable()
                ->paginate(15);

1 Ответ

0 голосов
/ 13 ноября 2018

Это правильное поведение, так как вы добавляете предложение orWhere после где.

Это приведет к следующему запросу:

SELECT * FROM your_table WHERE (user_id = xxx) OR (some condition that results true)

Поскольку false OR true равно true, первое предложение игнорируется (поскольку второе - true)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...