میلاد هدایت پور
4 سال پیش توسط میلاد هدایت پور مطرح شد
20 پاسخ

نشون ندادن همه اطلاعات توی یوزر

جدول یوزر

سلام من مشکل عجیبی دارم
توی جدول یوزرم اونایی که primary_id =0 هستن حساب های فرعی هستن
حالا من هرجا میخام ازونا استفاده کنم اصلا حسابشون نمیکنه
مثلا تعدادشون همیشه توی داشبرد 0 میزنه!!!
یا اصلا وقتی کل یوزرهارو میگیرم اصلا اونارو نشون نمیده!!!! انگار کلا مخفی شدن
کسی میدونه چرا اینطوری شده؟؟؟


ثبت پرسش جدید
محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 4 سال پیش آپدیت شد
1

خیلی دقیق متوجه ماجرا نشدم... ولی چند مورد زیر به نظرم اومد:

  • اول اینکه در دستورات مرتبط با کوئری تون برای دریافت تعداد رکوردها بهتره بجای اول get کردن و بعد count کردن مستقیما در همون ابتدا count کنید. نتیجه یکیه ولی سرعت و بهره وریش با حالت اول قابل مقایسه نیست. یعنی اینجوری نه:
    User::where('is_primary', '0')->get()->count(); 

بلکه اینجوری:

User::where('is_primary', '0')->count();
  • در خصوص deletedat که پرسیدید از کجا به کوئری اضافه شده، مربوط به امکان soft delete در لاراول هست و علت اضافه شدنش بصورت اتومات به کوئری تون فعال بودن soft delelte برای مدل User هست که اگر فایل فایل مدل User بشید می‌تونید trait مربوط به این قضیه رو ببینید. اساس کارش هم اینه که با این روش اگر کاربر رکوردی رو حذف کرد، بجای حذف کامل یک رکورد از دیتابیس، فیلد deletedat ش رو پر می‌کنه و از اون به بعد به چشم پاک شده نگاهش می‌کنه. پس اگر null بود یعنی پاک نشده. اطلاعات تکمیلی تر در مستندات لاراول موجود هست:
    https://laravel.com/docs/8.x/eloquent#soft-deleting
  • و اما در خصوص اینکه چرا بجای صفر، علامت سوال در کوئری می بینید، این قضیه طبیعی و درست هست. و اگر در همون گزارش کوئری، پارامتر بعدی یعنی bindings رو باز کنید می‌بینید که اونجا داره میگه که باید علامت سوال رو با مقدار صفر جایگزین کنه. کلا اساس کارش به همین شکل هست که مقادیر رو به شکل علامت سوال میذاره و بعد بصورت جداگانه نشون میده که هر کدوم با چه مقداری باید جایگزین بشن.
  • اگر هم همچنان اون اطلاعاتی که مدنظرتون هست رو دریافت نمی‌کنید، ابتدا کلا soft delete رو از تو فایل model غیرفعال کنید. اگر تاثیری نداشت باید دقت کنید که چه نوعی از داده برای ستون‌ isprimary قرار دادید. بهترین نوع برای داده های از این جنس TinyINT هست. همچنین در کوئری هاتون هم بجای اینجوری:
User::where('is_primary', '0')->get();

اینجوری بنویسید و آزمایش کنید:

User::where('is_primary', 0)->get();
  • و آخر اینکه به نظرم استفاده از پکیج laravel debugbar مخصوصا قسمت مربوط به نمایش کوئری های اجرا شده، خیلی می‌تونه در فرایند دیباگ کردن کمکتون کنه و فهمش راحت تر و سریع تر هست نسبت به روش vardump کردن کوئری به این شکل.

موفق و پیروز باشید.


نیما - ش
تخصص : برنامه نویس وب
@nimageneral 4 سال پیش مطرح شد
0

چه کوئری برای گرفتن داده ها استفاده می کنید؟


میلاد هدایت پور
تخصص : در حال پیشرفت
@miladparsi1070 4 سال پیش مطرح شد
0

@nimageneral

User::where('primary_id',0)->get()->count();

بهزاد عزیزان
@behzad.azizan 4 سال پیش مطرح شد
0

@miladparsi1070
سلام
یه کم موضوع عجیبه برام
مطمئنید که گلوبال اسکوپی توی مدلتون تعریف نکردید؟ من اینطور مواقع کوئری ایجاد شده توسط لاراول رو میخونم ببینم مشکل کجاست
دستور زیر رو قبل از اجرای کوئریتون بزنید و ببینید آیا لاراول شرط دیگه ای رو اضافه کرده یا نه :

Event::listen('illuminate.query', function($query)
{
    var_dump($query);
});

میلاد هدایت پور
تخصص : در حال پیشرفت
@miladparsi1070 4 سال پیش آپدیت شد
0

@behzad.azizan

 User::where('is_primary', 1)->get()->count()

این کوعریه منه
کجاش بزارم دقیقا کدمو؟
و اون کد رو کجا بزارم که اجرا شه


بهزاد عزیزان
@behzad.azizan 4 سال پیش مطرح شد
0

@miladparsi1070
کدی که نوشتم رو دقیقا قبل از کد خودتون بنویسید :

Event::listen('illuminate.query', function($query)
{
    var_dump($query);
});

 User::where('is_primary', 1)->get()->count()

این کار باعث میشه هر کوئری که توی لاراول اجرا میشه رو var_dump کنه و شما میتونید متن کوئری رو ببینید و دیباگ کنید کارتون رو
به جای var_dumpمیتونید کوئری رو توی فایل لاگ ذخیره کنید اگه مثلا پروزه شما وب سرویسی هست .


میلاد هدایت پور
تخصص : در حال پیشرفت
@miladparsi1070 4 سال پیش مطرح شد
0

@behzad.azizan
گذاشتم ولی هیچی وردامپ نکرد
توضیح تصویر رو وارد کنید


بهزاد عزیزان
@behzad.azizan 4 سال پیش مطرح شد
0

@miladparsi1070
خط 74 (بعد از var_dump ،
die
بزند


میلاد هدایت پور
تخصص : در حال پیشرفت
@miladparsi1070 4 سال پیش مطرح شد
0

@behzad.azizan
die نمیکنه اصلا ایونت اجرا نمیشه


بهزاد عزیزان
@behzad.azizan 4 سال پیش مطرح شد
0

@miladparsi1070
دستور زیر رو تست کنید :

\DB::connection()->enableQueryLog();
User::where('is_primary', 1)->get()->count();
dd(\DB::getQueryLog());

قبلی رو پاک کنید.


میلاد هدایت پور
تخصص : در حال پیشرفت
@miladparsi1070 4 سال پیش مطرح شد
0

این رو داد

این رو داد


بهزاد عزیزان
@behzad.azizan 4 سال پیش مطرح شد
0

@miladparsi1070
چک کنید ببینید فیلد deleted_at رکوردهایی که مقدارشون 1 هستن ، null هست یا نه
کوئریتون درسته و شرط اضافه ای روش ست نشده


بهزاد عزیزان
@behzad.azizan 4 سال پیش مطرح شد
0

@miladparsi1070
راستی فکر میکنم فیلد is_primary ایندکس نشده درسته؟
چون زمان اجرای کوئری شما نیم ثانیه س ! خیلی زیاده .


میلاد هدایت پور
تخصص : در حال پیشرفت
@miladparsi1070 4 سال پیش مطرح شد
0

@behzad.azizan
اره همه نال هستن


میلاد هدایت پور
تخصص : در حال پیشرفت
@miladparsi1070 4 سال پیش مطرح شد
0

@behzad.azizan نه ایندکس نیست


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 4 سال پیش مطرح شد
0
User::where('is_primary', 1)->count()

میلاد هدایت پور
تخصص : در حال پیشرفت
@miladparsi1070 4 سال پیش مطرح شد
0

@juza66
ببینید من این کد رو گذاشتم

 \DB::connection()->enableQueryLog();
        User::where('is_primary', '0')->get()->count();
        dd(\DB::getQueryLog());

و این نتیجه رو داد:
سوالم اینه که اون علامن سوال چیه؟ مگه مباید به جاش صفر بزاره؟؟؟
سوال دومم اینه که چرا where deleted_at is nullگذاشته؟؟؟ چون من توی دیتابیس فیلدایی که is_prmary =0 دارن همشون deleted_at شون نال هست پس چیزیو نمیاره!!!
میخوام بدونم کچا اون where deleted_at is null بهش اضافه شده
توضیح تصویر رو وارد کنید


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 4 سال پیش آپدیت شد
1

خیلی دقیق متوجه ماجرا نشدم... ولی چند مورد زیر به نظرم اومد:

  • اول اینکه در دستورات مرتبط با کوئری تون برای دریافت تعداد رکوردها بهتره بجای اول get کردن و بعد count کردن مستقیما در همون ابتدا count کنید. نتیجه یکیه ولی سرعت و بهره وریش با حالت اول قابل مقایسه نیست. یعنی اینجوری نه:
    User::where('is_primary', '0')->get()->count(); 

بلکه اینجوری:

User::where('is_primary', '0')->count();
  • در خصوص deletedat که پرسیدید از کجا به کوئری اضافه شده، مربوط به امکان soft delete در لاراول هست و علت اضافه شدنش بصورت اتومات به کوئری تون فعال بودن soft delelte برای مدل User هست که اگر فایل فایل مدل User بشید می‌تونید trait مربوط به این قضیه رو ببینید. اساس کارش هم اینه که با این روش اگر کاربر رکوردی رو حذف کرد، بجای حذف کامل یک رکورد از دیتابیس، فیلد deletedat ش رو پر می‌کنه و از اون به بعد به چشم پاک شده نگاهش می‌کنه. پس اگر null بود یعنی پاک نشده. اطلاعات تکمیلی تر در مستندات لاراول موجود هست:
    https://laravel.com/docs/8.x/eloquent#soft-deleting
  • و اما در خصوص اینکه چرا بجای صفر، علامت سوال در کوئری می بینید، این قضیه طبیعی و درست هست. و اگر در همون گزارش کوئری، پارامتر بعدی یعنی bindings رو باز کنید می‌بینید که اونجا داره میگه که باید علامت سوال رو با مقدار صفر جایگزین کنه. کلا اساس کارش به همین شکل هست که مقادیر رو به شکل علامت سوال میذاره و بعد بصورت جداگانه نشون میده که هر کدوم با چه مقداری باید جایگزین بشن.
  • اگر هم همچنان اون اطلاعاتی که مدنظرتون هست رو دریافت نمی‌کنید، ابتدا کلا soft delete رو از تو فایل model غیرفعال کنید. اگر تاثیری نداشت باید دقت کنید که چه نوعی از داده برای ستون‌ isprimary قرار دادید. بهترین نوع برای داده های از این جنس TinyINT هست. همچنین در کوئری هاتون هم بجای اینجوری:
User::where('is_primary', '0')->get();

اینجوری بنویسید و آزمایش کنید:

User::where('is_primary', 0)->get();
  • و آخر اینکه به نظرم استفاده از پکیج laravel debugbar مخصوصا قسمت مربوط به نمایش کوئری های اجرا شده، خیلی می‌تونه در فرایند دیباگ کردن کمکتون کنه و فهمش راحت تر و سریع تر هست نسبت به روش vardump کردن کوئری به این شکل.

موفق و پیروز باشید.


میلاد هدایت پور
تخصص : در حال پیشرفت
@miladparsi1070 4 سال پیش مطرح شد
0

@mhyeganeh مرسی از توضیحاتتون
من soft delete رو هم از مدل و هم از مایگرشن ها پاک کردم و دوباره کل جداول رو مایگرت کردم
الان مشکل اینجاست وقتی وارد صفحه ویرایش کاربر اصلی میشم، خود به خود تمام کاربران فرعی مربوط به اون یوزر از جدول یوزرها پاک میشه
میشه کمک کنید پیدا کنم مشکل از کجاست؟ خیلی مهمه برام
این مدل یوزرمه:

<?php

namespace App;

use App\Models\Connection;
use App\Models\Consult;
use App\Models\File;
use App\Models\Language;
use App\Models\License;
use App\Models\Note;
use App\Models\Research;
use App\Models\Sms;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;
    protected $guarded = [];
    protected $hidden = [
        'remember_token',
        'deleted_at',
    ];

    public function birthInfo()
    {
        return $this->hasOne(BirthInfo::class);
    }

    public function familiarity()
    {
        return $this->hasOne(Familiarity::class);
    }

    public function emigrationInfo()
    {
        return $this->hasOne(EmigrationInfo::class);
    }

    public function countries()
    {
        return $this->belongsToMany(Country::class);
    }

    public function visas()
    {
        return $this->belongsToMany(Visa::class);
    }

    public function educations()
    {
        return $this->hasMany(Education::class);
    }

    public function occupations()
    {
        return $this->hasMany(Occupation::class);
    }

    public function licenses()
    {
        return $this->hasMany(License::class);
    }

    public function researches()
    {
        return $this->hasMany(Research::class);
    }

    public function languages()
    {
        return $this->hasMany(Language::class);
    }

    public function files()
    {
        return $this->hasMany(File::class);
    }

    public function relations()
    {
        return $this->hasMany(Relation::class);
    }

    public function notes()
    {
        return $this->hasMany(Note::class);
    }

    public function consult()
    {
        return $this->hasOne(Consult::class);
    }

    public function customerManagements()
    {
        return $this->hasMany(CustomerManagement::class)->orderBy('id','desc');
    }

    public function customerManagementsHistory()
    {
        return $this->hasMany(CustomerManagementHistory::class)->orderBy('id','desc');
    }

//    public function relatives()
//    {
//        return $this->hasMany(User::class, 'primary_id', 'id');
//    }

    public function primary()
    {
        return $this->belongsTo(User::class);
    }

    public function connection()
    {
        return $this->belongsTo(Connection::class);
    }

    public function smses()
    {
        return $this->hasMany(Sms::class);
    }

}

سبحان دادخواه
تخصص : دانشجوی برنامه نویسی :)
@SobhanDadkhah 4 سال پیش مطرح شد
0

@miladparsi1070
سلام. راجب مشکل اخری که دارید داخل مدل که اتفاق خاصی نمیفته فقط روابط تعریف میشه. باید کد کنترلر قسمت مربوط به اکشن ویرایش کاربر رو چک کنید.
احتمالا در اون متد اتفاقی میفته که باعث پاک شدن یوزر های زیر دسته میشه 🧐


میلاد هدایت پور
تخصص : در حال پیشرفت
@miladparsi1070 4 سال پیش مطرح شد
1

@SobhanDadkhah
اره چک کردم مشکل از soft delete نبود
یه مشکل مسخره داشت که 3 روز وقتمو گرفته بود😖 حل شد خلاصه مرسی از همه


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

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