راکت

مشکل با حلقه زدن روی تاریخ ایجاد در لاراول

10 پاسخ

@ali.bayat
@Rp76
@mohaligateway
@juza66
سلام دوستان
توی مدل میخوام تا 10 روز قبل راروی یه جدول حلقه بزنم و جمع ستون sum_price را بگیرم ولی هرکاری میکنم با کربن نمیشه
چون توی جدول ستون created_at زمان هم ذخیره میشه و من میخوام فقط بر اساس تاریخ ایجادها بررسی کنم و نمیخوام زمان created_at را مدنظر قرار بده
لطفا کمک کنید
سپاس

public function works_pu()
    {
        $period = CarbonPeriod::create(Carbon::now()->subDays(10), Carbon::now());
        foreach ($period as $date) {
            $query = $this->hasMany(work::class)->where('created_at', '=', $date->toDateString())->sum('sum_price');
            ?>
            <li class="list-group-item d-flex justify-content-between align-items-center">
                <span>درآمد <?php echo $date->toDateString() ?></span>
                <span class="badge badge-info badge-pill badge-round ml-1"><?php echo $query?></span>
            </li>
            <?php

        }
    }
نوب
نوب
@yk5742g
ثبت پرسش جدید

پاسخ‌ها

10
Muhammad
Muhammad
@muhammad

تخصص: Back-End Developer

سلام.

قبل از همه بگم که کد HTML گذاشتن توی مدل یه کار کاملا اشتباهه چون کار مدل خروجی HTML دادن نیست.
دوم اینکه شما تیبلت رو بهم نشون بده که برات کدشو بنویسم و این همه شلوغ‌کاری نشه.

نوب
نوب
@yk5742g

تخصص: کدنویس نوب :)

@muhammad
سلام
این کد تیبل works

Schema::create('works', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->unsignedBigInteger('user_id');
            $table->foreign('user_id')->references('id')->on('users');
            $table->unsignedBigInteger('customer_id');
            $table->foreign('customer_id')->references('id')->on('customers');
            $table->unsignedBigInteger('office_id');
            $table->foreign('office_id')->references('id')->on('offices');
            $table->string('price');
            $table->string('sum_price');
            $table->string('price_off');
            $table->string('price_one');
            $table->enum('invoice_paid',['no','yes'])->default('no');
            $table->enum('invoice',['no','yes'])->default('no');
            $table->string('stock');
            $table->string('type');
            $table->string('deposit');
            $table->string('status');
            $table->string('invoice_id')->nullable();
            $table->text('information')->nullable();
            $table->timestamps();
        });

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

رضا پارسیان
رضا پارسیان
@Rp76

تخصص: توسعه دهنده Php , Laravel

سلام وقتتون بخیر!

من نمیدونم خروجی CarbonPeriod چطور هست ولی پیشنهاد من اینه!

البته قبلش بگم که اینکار رو کنی سریع تموم میشه همه مشکلات، البته اگر خروجی carbon period تاریخ باشه فقط

$query = $this->hasMany(work::class)->where('createdat',"like","% {$date->toDateString()}%")->sum('sumprice');

ولی راه حل من چیه؟

$date="2020-01-01";  
$data=Model::wehreDate("createdat",$date)->selectRaw("*,sum('sumprice') as newsum")->get(); // in code toye controller bayad bezari va data ro bedi be blade

باید بگم که کد من فقط برای یک روز رو میاره برای این که بین ۲ تا تاریخ باشه باید اینکار رو کنی

$start="2020-01-01";  
$end="2021-01-01";

$data=Model::wehreDate("createdat",">=",$start)->wehreDate("createdat","<=",$end)->selectRaw("*,sum('sumprice') as newsum")->get();
نوب
نوب
@yk5742g

تخصص: کدنویس نوب :)

@Rp76 سلام عزیز
با راهنمایی شما درست شد ممنون :)
فقط یه مشکلی دارم
میخوام حلقه برعکس اجرا بشه
یعنی تاریخ امروز اول قرار بگیره و تاریخ روزهای گذشته به ترتیب بعدا قرار بگیره ولی الان برعکسه و تاریخ روز فعلی آخر قرار میگیره
کدها را میزارم

متد درون مدل User

public function period_time()
    {
        return CarbonPeriod::create(Carbon::now()->subDays(2), Carbon::now());
    }

کد دورن فایل view

@foreach (auth()->user()->period_time() as $date)
                                @php($sum = \App\Models\work::where('user_id', auth()->user()->id)->whereDate("created_at", $date)->sum('sum_price'))
                                    <div class="row shadow-sm border border-1 border-success align-middle mb-1">
                                        <div class="col-lg-6">درآمد تاریخ : {{verta($date)->format('d %B Y')}}</div>
                                        <div class="col-lg-6 text-left">
                                            {{number_format($sum)}}
                                            <br>
                                            {{$numToWord->numberToWords($sum)}}
                                        </div>
                                    </div>
                            @endforeach

اینم تصویر خروجی فعلی
اسکرین شات

Muhammad
Muhammad
@muhammad

تخصص: Back-End Developer

@yk5742g
توی کوئری بیلدر از orderBy استفاده کنین تا به ترتیبی که می‌خوایین برگرده. وقتی روی created_at (یا بهتر از اون id) با desc مرتب بشه، میشه چیزی که شما می‌خوایین. البته روی collection هم متد reverse رو داریم که کالکشن رو برعکس می‌کنه.

سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

در ادامه صحبت دوستان ، از reverse کردن اطلاعات میتونی استفاده کنی ، مثلا یک کار مبتدیانه اش اینه توی حلقه اینکار رو کنی

@foreach (auth()->user()->period_time()->reverse() as $date)
                                @php($sum = \App\Models\work::where('user_id', auth()->user()->id)->whereDate("created_at", $date)->sum('sum_price'))
                                    <div class="row shadow-sm border border-1 border-success align-middle mb-1">
                                        <div class="col-lg-6">درآمد تاریخ : {{verta($date)->format('d %B Y')}}</div>
                                        <div class="col-lg-6 text-left">
                                            {{number_format($sum)}}
                                            <br>
                                            {{$numToWord->numberToWords($sum)}}
                                        </div>
                                    </div>
                            @endforeach
رضا پارسیان
رضا پارسیان
@Rp76

تخصص: توسعه دهنده Php , Laravel

دوستان جواب دادند از order by استفاده کنی حل میشه بر اساس id

سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

فقط یک سوال چرا همه کدها رو توی بلید نوشتی؟ بنظرم ریفکتور کنید.
اون orderby که آقای محمد و رضا اشاره کردن رو باید روی کدهات مثلا

$sum = \App\Models\work::where('user_id', auth()->user()->id)->whereDate("created_at", $date)->sum('sum_price')

یعنی میشه


$sum = \App\Models\work::where('user_id', auth()->user()->id)->whereDate("created_at", $date)->orderBy('id', 'DESC')->sum('sum_price')

اعمال کنی ، مثال زدم شما باید توی همون مدل که اطلاعات رو میگیری بنویسی

نوب
نوب
@yk5742g

تخصص: کدنویس نوب :)

@Rp76
@juza66
سلام دوستان عزیز

این چیزایی که گفتین برای order کردن خروجی از دیتابیس هست
اگر دقت کنید شمارش خونه های حلقه بر اساس subDays از Carbon صورت میگیره
یه جوری باید حلقه را برعکس کنم :)

رضا پارسیان
رضا پارسیان
@Rp76

تخصص: توسعه دهنده Php , Laravel

سلام دوباره

پس ارایه رو برعکس کن 😂🤣
البته برعکس کرده بودی
تو حالت عادی تست کن بعد اگر نشد کد زیر رو

foreach (array_reverse(auth()->user()->period_time()) as $date)

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

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