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

مشكلة تسجيل الدخول باستخدام اسم المستخدم أو البريد الإلكتروني في لارافل

Abdelrahman Mostafa10

السؤال

أواجه مشكلة لا أفهم حتى كيفية البدء في إصلاحها،  أقوم بتمرير حقل النموذج المسمى 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...