امین
1 سال پیش توسط امین مطرح شد
11 پاسخ

ذخیره در دیتابیس

سلام
اگر بخوام داده ای رو از ورودی بگیرم و همون موقع با داده قبلی همون فیلد جمعش بزنم و حتماً ذخیره ش کنم چیکار باید بکنم؟
مثلاً در بلید یک اینپوت دارم که کاربر مقداری رو وارد میکنه و میخوام با دادهای قبلی که از طریق همون اینپوت وارد شده جمع بشه.
یعنی جدولی با 2 تا فیلد دارم که یکی ورود داده جدید هست و یکی دیگه جمع همه ورودی های قبلی + ورودی جدید.
من خیلی راههای مختلفی رفتم، همه سایتارو زیرو رو کردم ولی نتیجه نگرفتم.
ممنون


ثبت پرسش جدید
محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 1 سال پیش مطرح شد
1

سلام مجدد دوست عزیز
فیلد محاسباتی عملا جیزی نیست خودش
یعنی شما sum رو نداری جایی اصلا و نگهداری نمیکنی
به جاش گردش کتاب هات رو نگهداری میکنی
یعنی چی ؟ یعنی میزان افزایش و کاهش کتاب هارو دونه دونه سطر براش ایجاد میکنی که میشه همون چیزی که گفتی مدیریت میخواد بدونه هر تاریخی چه تعداد کتاب اضاف شده
مثلا شنبه 5 تا
یک شنبه 10 تا
دو شنبه 2 تا
حالا هر بار و هر وقت به جمعشون نیاز داشتی عملیات sum رو روشون اجرا میکنی
فرض بگیر اسم جدولت هست new_books و ستونی داره به اسم count که تعداد کتاب ها که همین 5 و 10 و 2 هست رو توی سه سطر نگه داشته
خیلی راحت با استفاده از دستور sum لاراول بیا مجموعش رو بدست بیار
اگر اسم مدلت NewBook باشه میشه شکل زیر

$sum=NewBook::sum('count')

ممکنه مجبور شی قبل get کنی بعد sum بگیری خیلی خاطرم نیست


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 1 سال پیش مطرح شد
0

سلام
چیزی که من متوجه شدم شما فقط یک input داری و یه نمایش جمع
هر بار عدد میدی و میخوایی با اعداد قبلی جمع بشه
این موضوعی که میگی به لاراول ربط نداره مگر این که از liviwire استفاده کنی که بازم راه حل کلی یکیه
شما برای حل این موضوع از js و یا jq استفاده میکنی
خیلی خیلی ساده یک متغییر از نوع global که توی کل جریان بهش دسترسی داشته باشی تعریف میکنی و مقدار اولیه صفر قرار میدی و یا از دیتابیس میخونیش مقدار دهیش میکنی این فیلد مجموعت
در رویداد onBlur از input خودت میایی تابعی تعریف میکنی که مقدار input رو بگیره و با مقدار فیلد مجموع جمع ببنده و اگر نیاز هست به دیتابیس درخواست بده برای ثبت و ویرایش
اینجا باید حواست باشه که اگر onChange بزاری چالش مواجه میشی
مثلا کاربر اگر بخواد عدد 100 رو با مجموع قبلی 0 تایپ کنه که جمع بسته بشه و نمایش 100 رو ببینه مجدد
در مرحله اول عدد 1 رو میزنه و چون input مقدارش تغییر کرده و change شده میگه جمع تا اینجا شده 1
عدد بعدی که کاربر میزنه 0 و فیلد ورودی میشه 10 با مجموع قبل 1 تغییر میده و میشه 11
عدد اخر هم کاربر میزنه 0 که میشه 100 با مجموع قبل 11 جمع میشه و میشه 111
حواست باشه گیر همچین داستانی نکنی و ترجیحا یه دکمه تایید بزاری یا همون blur بد نیست چون برای تایپ عدد 100 ما سه بار change داریم و سه بار جمع میبنده که نمیخواییم همچین چیزی رو


امین
@safaeiiam 1 سال پیش آپدیت شد
1

سلام
حدستون درست بود
ممنون
ولی هرچی کد میزنم دیتابیس مقدار نمیگیره
میشه برام یک نمونه کد بزاری؟
ممنون میشم


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 1 سال پیش مطرح شد
0

متوجه منظورتون که دیتابیس مقدار نمیگیره نشدم
شما توضیح بده کدت چیکار میکنه
نمونه کد و اگر هم امکانش هست استکرین شات از صفحه ویو بزار و بگو میخوایی چیکار کنی ک بیشتر راهنماییت کنم
الان میخوایی با لایو وایر این کار رو انجام بدی ؟
لطفا همون کد شکسته بسته ی خودتون رو بزارید که اگر بشه همونو تغییر بدیم


امین
@safaeiiam 1 سال پیش آپدیت شد
0

سلام
ممنون
توی view یک شمارنده دارم، یک اینپوت دارم و یک دکمه . داخل اینپوت هر عددی وارد کنم میاد با عدد قبلی جمع میشه و شمارنده اون عدد جدید که جمع همه اینپوت هاست را نمایش میده. داخل جدول هم فقط 2 تا ستون دارم که یکی جمع همه اعداد را نگه می داره به نام: allbooks و یکی اینپوت جدید رو به نام: endbooks . داخل مدل هم هر دو رو fillable کردم. داخل کنترلر هم دوتاشو مقدار گرفتم و از متد save استفاده کردم.
من خیلی js کار نکردم و تازه کارم ،(مطمئناً اشتباه نوشتم) ممنون میشم کدهای جاوا رو درست کنید و یک توضیح مختصری بدین. ممنون
این کد بلید:

<div class="col-lg-3 col-6 text-center">
                @if (!empty($libraries))
                    <span data-toggle="counter-up">{{ $libraries->allbooks}}</span>
                @endif
                <p>کتاب ها</p>
            </div>
            <div class="row control">
                <h4>تعداد کتاب جدید</h4>
                <form action="{{ route('libraries.store') }}" method="POST">
                    @csrf
                    <input type="text" name="endbooks" id="endbooks" style="margin-bottom: 5px"
                        onblur="sumbook()"><input type="submit" value="تعداد کتاب">
                    <script>
                        document.getElementById("endbooks").onblur = function() {
                            sumbook()
                        };
                        global $sum = 0;

                        function sumbook() {
                            $sum =endbooks + allbooks;
                        }
                    </script>
                </form>
            </div>

 تصویر


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 1 سال پیش مطرح شد
0

سلام مجدد اول این که ایا از livewire داری استفاده میکنی یا نه ؟ چون این مسیر برای لایو وایر نیست و روش دیگری داره اون
دوم این که اگر دکمه قرار دادی برای input چرا از blur استفاده میکنی و نیازی نیست دیگه
باید توی رویداد کلیک دکمه عملیاتت رو انجام بدی
و مورد دیگه چرا وسط کد جاوا اسکریپت متغییر های php با علامت $ قرار دادی
توی جاوا اسکریپت همین که خارج از تابع نوشته بشه گلوبال به حساب میاد اون متغییر
و این که توی فرم شما اومدی داری ارسال اطلاعات میکنی یعنی هر بار صفحه رفرش میشه و داده میره سمت سرور و شما اصلا نیاز به هیچ عملیاتی باز اینجا نداری اگر روش کارت اینجوریه
یعنی فقط عدد submit میشه ارسال میشه به روتی که توی فرم مشخص کردی و اونجا باید توی دیتا بیس ذخیره کنی و داده جدید مجدد بعد رفرش صفحه نمایش داده بشه
پس تا اینجا شما کلا باید هرچی جاوا اسکریپت داری پاک کنی و به شکل فرم و ارسال درخواست عمل کنی و مشکلت رو سمت سرور بهم نشون بدی

حالا من یه کد ساده واسه این که از نظر js یه دیدی داشته باشی و ببینی چطوریه برات زدم الان کپی کن تو یه صفحه html اجرا کن

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>
        <input type="text" id="counter" value="0">
        <button onclick="calculateSum()">submit</button>
        <span>sum of books : </span><span id="sum"></span>
    </div>
</body>
<script>
    let sum = 0 ;
    document.getElementById('sum').textContent=sum;
    function calculateSum(){
        let count = parseInt(document.getElementById('counter').value)
        document.getElementById('counter').value=0;
        sum+=count;
        document.getElementById('sum').textContent=sum;
    }
</script>
</html>

کلا کاری که شما داری میکنی اگر میخوایی از js استفاده کنی دیگ نباید از فرم استفاده کنی و کلا باید حذفش کنی و از دستورات ajax استفاده کنی و درخواست بدی سمت سرور و عدد رو ویرایش کنی
اگرم از فرم میخوایی استفاده کنی باید js حذف کنی و سمت سرور ثبت داده داشته باشی
توی روش اول که با js هست صفحه رفرش نمیشه اصلا و درخواست فقط میره و میاد که زیبا تره و یوزر فرندلی تره
تو حالت دوم شما هر بار داری صفحه رو رفرش میکنی
دلیل نگه داری endbook رو هم نمیفهمم چیه
شما یه عدد میگیری جمع میکنی دیگه جرا نگهش میداری توی دیتا بیس


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 1 سال پیش مطرح شد
0

ببین عزیز
از اونجایی که برای button از input استفاده میکنید حدس میزنم اموزش های قدیمی ای رو دیدید چون قبلا خیلی عرف بود این کار الان تقریبا همه دیگ button استفاده میکنن
موضوع مهمی هم نیست ولی از اونجایی که میگید ضعیف هستید در js کلا پیشنهاد میکنم یک بار از سایت w3schools مباحث پایه رو هرچقدر هم که بلد هستید دو سه روز وقت بزارید چشمی نگاه کنید
من خودمم بعد از یکی سال که اشنا بودم با فرانت رفتم و مجدد از سایتش مطالعه کردم چون ناقص و قدیمی هست اموزشات ویدیویی
در کل نیاز دارید مخصوصا js خودتون رو هم تقویت کنید هر چند که بکند کار هستید اما اشنایی پایه با فرانت لازمه ی هر بکند کاری هست
کمتر از یک هفته وقتتون رو میگیره ولی واجب هست یادگیریشون


امین
@safaeiiam 1 سال پیش آپدیت شد
0

سلام
ممنون بابت پاسخگوییت
یک سؤال؟
اگر من بخوام همین مقدار sum رو ذخیره کنم چطوری باید کدشو بنویسم؟
اگر ممکنه یک نمونه ajax که گفتین رو بزارید، ممنون
اینکه گفتین چرا می خوام مقدار ورودی جدید ذخیره بشه چون مدیر تو صفحه مدیریتش می خواد بدونه در چه تاریخی چه مقدار کتاب به خزانه وارد شده. این خیلی براش مهم بود
یعنی توی صفحه مدیریت هم می خواد بدونه در چه تاریخی چه مقدار کتاب اضافه شده و هم اینکه تعداد کل کتاب ها چقدر شده
ممنون


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 1 سال پیش آپدیت شد
0

سلام مجدد

مدیریت هم می خواد بدونه در چه تاریخی چه مقدار کتاب اضافه شده و هم اینکه تعداد کل کتاب ها چقدر شده

در این مورد که شما باید یه جدول داشته باشید که همه ی کتاب هایی که اضاف میشه رو نگه دارید و نه فقط اخری رو
و دیگه نیاز به فیلد sum ندارید که یه جایی نگه داری بشه
میتونید هر بار که نیاز میشه محاسبه کنیدش با دستور sum
البته بستگی به سازو کار پروژتون داره که بخوایید به چه شکلی باشه

برای ajax مربوط به jquery میشه و شما باید اون رو اول اضاف کنید اگر ندارید به جاش از fetch و یا axios میتونید استفاده کنید برای js

اگر ممکنه یک نمونه ajax که گفتین رو بزارید، ممنون

همچین کدایی بی نهایت توی نت هست
ولی چون چند تا چالش ریز داره راهنماییت میکنم اما لطفا اینجور چیزا رو سرچ کن و بهش برس چون بعدا به مشکل میخوری
مورد اول csrf هست برای ارسال درخواست ها که میتونی دو کار براش بکنی
یک این که اون روت رو ببری توی لیستی که نیاز به csrf نداره که پیشنهاد نمیشه
میتونی csrf رو توی هدر درخواستت قرار بدی
من یه متا تگ تعریف کردم و اول توی اون گزاشتم csrf رو

<meta name="csrf-token" content="{{ csrf_token() }}">

بعد برای ajax خودم هدر رو مشخص میکنم

$.ajaxSetup({
        headers:{
            'X-CSRF-TOKEN':document.head.querySelector('meta[name="csrf-token"]').content,
            // 'Content-Type':'application/json'
        }

و در نهایت خود درخواستم

            var data={
                explain:$('#output-explain').val()
            }

                $.ajax({
                    type:'POST',
                    url:'/storehouse-output/store',
                    data:data,
                    dataType: 'JSON',
                    success:function (response) {

                    }
                }).done(function () {

                })

سرچ کنید نمونه های خیلی بیشتری براتون میاره و اگر jquery استفاده نمیکنید نیازی نیست به خاطر یه ajax به پروژتون اضاف کنیدش

شما مقدار sum رو ارسال نمیکنید سمت سرور چون از قبل داریدش
فقط مقدار جدید کتاب که add شده رو میفرستی و توی سرور خودت جمع میبندی که به مشکلی نخوری
و حتی گقتم میتونی اصلا sum نداشته باشی و فیلد محاسباتی باشه


امین
@safaeiiam 1 سال پیش آپدیت شد
1

سلام
ممنون از وقتی که گذاشتید
میشه در مورد فیلد محاسباتی یک مثالی بگذارید؟
من باهاش به مشکل خوردم
ممنون


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 1 سال پیش مطرح شد
1

سلام مجدد دوست عزیز
فیلد محاسباتی عملا جیزی نیست خودش
یعنی شما sum رو نداری جایی اصلا و نگهداری نمیکنی
به جاش گردش کتاب هات رو نگهداری میکنی
یعنی چی ؟ یعنی میزان افزایش و کاهش کتاب هارو دونه دونه سطر براش ایجاد میکنی که میشه همون چیزی که گفتی مدیریت میخواد بدونه هر تاریخی چه تعداد کتاب اضاف شده
مثلا شنبه 5 تا
یک شنبه 10 تا
دو شنبه 2 تا
حالا هر بار و هر وقت به جمعشون نیاز داشتی عملیات sum رو روشون اجرا میکنی
فرض بگیر اسم جدولت هست new_books و ستونی داره به اسم count که تعداد کتاب ها که همین 5 و 10 و 2 هست رو توی سه سطر نگه داشته
خیلی راحت با استفاده از دستور sum لاراول بیا مجموعش رو بدست بیار
اگر اسم مدلت NewBook باشه میشه شکل زیر

$sum=NewBook::sum('count')

ممکنه مجبور شی قبل get کنی بعد sum بگیری خیلی خاطرم نیست


امین
@safaeiiam 1 سال پیش مطرح شد
1

سلام
ممنون
حل شد


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

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