سؤال

لدي جدولين في 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 لأنك لا تحاول تحديد أدوارك من خلال المستخدمين المرتبطين، ولكن من خلال المعرف الذي تستخدمه في هذه الحالة 3with() ستعمل بشكل جيد تماما و 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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top