اذهب إلى المحتوى

السؤال

نشر

أواجه مشكلة لا أفهم حتى كيفية البدء في إصلاحها،  أقوم بتمرير حقل النموذج المسمى emailOrUsername، ثم استخدام استعلامات where وorWhere لفحص عمودين في جدول، ولكنني أحصل على خطأ يستخدم اسم حقل / معلمة الطلب كعمود غير موجود.

الكود:

public function login(Request $request)
    {
        $credentials = $request->validate([
            'emailOrUsername' => 'required',
            'password' => 'required',
        ]);

        $user = User::where('email', $request-> emailOrUsername)
                    ->orWhere('username', $request-> emailOrUsername)
                    ->first();

        echo($user);

        if ($user && Auth::attempt($credentials)) {
                $user = Auth::user();
                $user->createToken('_token')->plainTextToken;
     
                return response()->json([
                    "message" => "Successfully logged in.",
                ], 200);
            }

        return response()->json([
            "message" => "The provided credentials do not match our records."
        ], 404);
    }

الخطأ:

{
    "message": "SQLSTATE[42S22]: Column not found: 1054 Unknown column 'emailOrUsername' in 'where clause' (Connection: mysql, SQL: select * from `users` where `emailOrUsername` = wuceruda limit 1)",
    "exception": "Illuminate\Database\QueryException"
}

ملحوظة: عندما أرسل قيمة emailOrUsername خاطئة (ليست مستخدم صالح) ، أحصل فعلاً على استجابة خطأ في بيانات الاعتماد الخاطئة.

لدي الفعلي عمودين هما username و email في جدول المستخدمين.

Recommended Posts

  • 0
نشر (معدل)

المشكلة هنا يبدو انه يستخدم اسم "emailOrUsername" كاسم عمود في الاستعلامات where و orWhere.

يمكنك تجربه هذا الحل:

$user = User::where(function ($query) use ($request) {
  $query->where('email', $request->emailOrUsername) 
  	->orWhere('username', $request->emailOrUsername);
}) 
->first(); 

هذا التحديث يستخدم دالة where لتحديد الشرط ويستخدم orWhere داخلها لتحديد أن يكون الحقل إما email أو username.
او تجربه هذا الحل:
 

$user = User::where('email', $request->input('emailOrUsername'))
              ->orWhere('username', $request->input('emailOrUsername'))
              ->first();

بهذه الطريقة ستستخدم القيمة الفعلية المرسلة في حقل emailOrUsername وليس اسم الحقل نفسه كاسم عمود.

تم التعديل في بواسطة Khaled Osama3
  • 0
نشر

يبدو أن المشكلة التي تواجهها تتعلق بكيفية التعامل مع الاستعلام في Laravel عند استخدام متغير emailOrUsername. الخطأ يشير إلى أن Laravel يحاول استخدام emailOrUsername كاسم عمود في قاعدة البيانات، وهو غير موجود فعليًا. الحل هو التأكد من أنك تمرر القيمة الصحيحة للعمود المناسب.

في الكود الخاص بك، يتم استخدام emailOrUsername مباشرة في الاستعلام، وهو ما يسبب الخطأ. يجب عليك استخدام طريقة تتيح لك التحقق من كلا العمودين email و username بشكل منفصل. إليك الطريقة المُحسنة للقيام بذلك:
 

public function login(Request $request)
{
    $credentials = $request->validate([
        'emailOrUsername' => 'required',
        'password' => 'required',
    ]);

   
    $user = User::where(function($query) use ($request) {
        $query->where('email', $request->emailOrUsername)
              ->orWhere('username', $request->emailOrUsername);
    })->first();

    //...
}

في هذا التعديل، استخدمنا الدالة where بشكل يسمح لنا بالتحقق من العمودين email و username باستخدام القيمة المُدخلة في emailOrUsername. بذلك، يتم تجنب محاولة استخدام emailOrUsername كاسم عمود في الجدول.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...