التصفية على الجدول المحوري Laravel
سؤال
لدي جدولين في Laravel
متصلة بجدول محوري.الجدولين هما users
و roles
, ، ويتم استدعاء الجدول المحوري role_user
.يحتوي الجدول المحوري أيضًا على حقلين إضافيين: start
و stop
.بهذه الطريقة يمكنني تتبع الأدوار التي أ user
كان في الماضي.
الآن أريد إنشاء استعلام يحصل على كل شيء users
الذين لديهم حاليا role_id = 3
.
أولا كنت قد استخدمت WherePivot
, ، ولكن على ما يبدو أن هذا هو تنصتت.
لقد قمت الآن بإجراء الاستعلام التالي باستخدام Eloquent
:
Role::with('User')
->where('id', '=', '3')
->where('role_user.start', '<', date('Y-m-d'))
->where('role_user.stop', '>', date('Y-m-d'))
->whereHas('users', function($q){
$q->where('firstname', 'NOT LIKE', '%test%');
})
->get();
ولكن بطريقة ما تظهر لي رسالة خطأ مفادها أنه لا يمكن العثور على بداية عمود الجدول المحوري.ولكن يمكنني أن أؤكد في PHPMyAdmin
أن العمود هناك.
وهذا هو الخطأ برمته:
Illuminate \ Database \ QueryException
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'klj_role_user.start' in 'where clause' (SQL: select * from `klj_roles` where `id` = 3 and `klj_role_user`.`start` < 2014-06-02 and `klj_role_user`.`stop` > 2014-06-02 and (select count(*) from `klj_users` inner join `klj_role_user` on `klj_users`.`id` = `klj_role_user`.`user_id` where `klj_role_user`.`role_id` = `klj_roles`.`id` and `firstname` NOT LIKE %test%) >= 1)
هل يمكن لأحد أن يخبرني إذا كنت أفعل شيئًا خاطئًا أو يعطيني تلميحًا أين يجب أن أبحث الآن؟
المحلول
الخطأ يخبرك أنك في عداد المفقودين start
العمود في الجدول المحوري الخاص بك klj_role_user
.ما يجب عليك فعله هو إنشاء العمود.إذا كان العمود موجودًا بالفعل، فتأكد من أنك تستخدم قاعدة البيانات الصحيحة.
لقد قمت أيضًا بتبسيط استفسارك قليلاً.أنت لا تحتاج حقًا إلى whereHas
لأنك لا تحاول تحديد أدوارك من خلال المستخدمين المرتبطين، ولكن من خلال المعرف الذي تستخدمه في هذه الحالة 3
.أ with()
ستعمل بشكل جيد تماما و wherePivot()
يبدو أنه يعمل بشكل جيد بالنسبة لي عند استخدامه مع with()
.
$role = Role::with(array('users' => function($q)
{
$q->wherePivot('start', '>', date('Y-m-d H:i:s'));
$q->wherePivot('stop', '<', date('Y-m-d H:i:s'));
$q->where('firstname', 'NOT LIKE', '%test%');
}))->find(3);
foreach($role->users as $user) {
echo $user->firstname;
}