راکت
حل شده

مشکل در api لاراول

10 پاسخ

سلام
من یک api با استفاده از passport روی لاراول پیاده سازی کردم، با استفاده از oauth/token میام و کاربرم رو لاگین میکنم، بعد یک route دارم شبیه به کد زیر:

Route::get('/getProfile', 'AuthController@profile')->middleware('auth:api');

و متد مربوطه به این route:

public function profile(){
        $userProfile = auth('api')->user()->with('meta')->get();
        return response()->json(['message' => $userProfile]);
    }

طبیعتا این کد باید صرفا کاربر جاری که با استفاده از api و به روش فوق لاگین کرده رو نمایش بده اما میاد و کل کاربران رو واسم نمایش میده

نمیدونم چرا چنین اتفاقی افتاده، واسم منطقی نیست، کسی میتونه کمکی بده؟

@ali.bayat

مهدی
مهدی
@mrmmg
ثبت پرسش جدید

پاسخ‌ها

10
علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

بهترین پاسخ

@mrmmg

مشکل که نیست.. این تفاوت عملکرد بین این ۲ متد هست

روابط در مدل های الکوئنت، در پشت صحنه از Join های بین جداول استفاده میکنند
نوع فراخوانی داده ها در متد های with و load با هم فرق میکنه
که این تفاوت باعث میشه نوع کوئری های متفاوتی ساخته و اجرا بشه


من جداول شما رو ندارم اما با رابطه بین User و Roles برات مثال میزنم:
اگر من بیام یه User رو پیدا کنم و با With بخواهم رابطه Roles رو بگیرم
یعنی چنین حالتی:

User::find(4)->with('roles')->get()

کوئری هایی که تولید میشند به شکل زیره:


"select * from `users` where `users`.`id` = 4 limit 1";

"select * from `users`";

"select `roles`.*, `model_has_roles`.`model_id` as `pivot_model_id`, `model_has_roles`.`role_id` as `pivot_role_id`, `model_has_roles`.`model_type` as `pivot_model_type` from `roles` inner join `model_has_roles` on `roles`.`id` = `model_has_roles`.`role_id` where `model_has_roles`.`model_id` in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) and `model_has_roles`.`model_type` = `App\User`"

من توی سیستمم کلا ۱۲ تا User دارم و میبینی که توی کوئری سوم داره whereIn روی هر ۱۲ تا کاربر زده میشه..
همچنین توی کوئری دوم هم داره تمام کاربرا رو میگیره
برای همین هم تمام کاربر ها رو برمیگردونه


حالا اگر از Load استفاده کنم:

User::find(4)->load('roles')

کوئری هایی که تولید میشند به شکل زیره:


"select count(*) as aggregate from `users`";

"select * from `users` where `users`.`id` = 4 limit 1";

"select `roles`.*, `model_has_roles`.`model_id` as `pivot_model_id`, `model_has_roles`.`role_id` as `pivot_role_id`, `model_has_roles`.`model_type` as `pivot_model_type` from `roles` inner join `model_has_roles` on `roles`.`id` = `model_has_roles`.`role_id` where `model_has_roles`.`model_id` in (4) and `model_has_roles`.`model_type` = `App\User`";

اما این بار فقط یک آی‌‌دی توی whereIn داریم

با توجه به نوع کوئری هایی که اجرا میشه، چنین نتیجه ای کاملا منطقی هست

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

احتمالا به علت استفاده از متد with هست
به جاش از load استفاده کن
باید مشکل حل بشه

مهدی
مهدی
@mrmmg

تخصص: برنامه نویس و طراح وب

@ali.bayat
کلا اون قسمت with رو هم پاک کردم و به توصیه شما از load هم استفاده کردم ولی تاثیری نداشت و نتیجه به طرز عجیبی یکسانه!

$userProfile = auth('api')->user()->get();

بدون رابطه هم بازم کل کاربران رو برمیگردونه

نسخه لاراول 7.30 هست، میتونه مشکل از لاراول باشه؟

شاید پاسخ شما همین‌جا باشد

Majid Goudarzi
Majid Goudarzi
@masterspyware

تخصص: برنامه نویس

لطفا midleware روتر api رو مجددا بررسی کنید.
اگر مشکلی نداشت میتونید مقدار count کاربر تونو بگیرید.
اگر همه رو حساب کرد یعنی یا توو دیتابیس یا توو شرطتون ی باگ داره

مهدی
مهدی
@mrmmg

تخصص: برنامه نویس و طراح وب

@masterspyware
اینکارهارو به جز بررسی میدلور انجام دادم و در هر صورت تمام کاربران رو برمیگردونه
شرط خاصی هم اعمال نکردم! نمونه کدش رو بالا فرستادم

مگر اینکه پاسپورت روشی برای احراز هویت کاربر ارائه بده که من نمیشناسمش و گرنه همین شرایط با میدولور auth که guard پیشفرض web روش اعمال میشه نتیجه صحیح هست

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

من با نسخه 7.28 لاراول همچین مشکلی ندارم
بعید میدونم از نسخه لاراول باشه.

اگر فقط کاربر رو برگردونی، باز هم همین مشکل هست؟

$user = auth('api')->user()
مهدی
مهدی
@mrmmg

تخصص: برنامه نویس و طراح وب

@ali.bayat
دقیقا این مورد رو انجام دادم و مشکلی حل شد، در واقعی هنگامی که رابطه رو درخواست میدم گیج میشه
شما دلیلش رو میدونید؟

مهدی
مهدی
@mrmmg

تخصص: برنامه نویس و طراح وب

@ali.bayat
به طور اتفاقی اومدم و از load استفاده کردم به جای with و مشکل حل شد

$userProfile = auth('api')->user()->load('meta');

درسته مشکل حل شده ولی هنوزم واسم سواله چرا باید برای لاراول این مشکل عجیب به وجود بیاد

مهدی
مهدی
@mrmmg

تخصص: برنامه نویس و طراح وب

@ali.bayat واقعا مرسی از توضیحات خوبتون، لذت بردم

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

خواهش می‌کنم
موفق باشی

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام