۱۶ Mahdi
استفاده از logic در کنترلر
جامعه لاراول ایجاد شده در ۱۶ دی ۱۴۰۱

سلام استاد

من اومدم قبل از اینکه از scope‌ها استفاده کنم

کل لاجیک رو در کنترلر categoryVideoController قرار دادم

<?php
namespace App\\Http\\Controllers;
use App\\Models\\Category;
use Illuminate\\Http\\Request;
use Illuminate\\Support\\Facades\\DB;
class CategoryVideoController extends Controller
{
    public function index(Request $request, Category $category)
    {
        $videos = $category->videos();
        if ($request->has('sortBy') && $request->sortBy == 'created_at') {
            $videos = $videos->orderBy('created_at', 'desc');
        }
        if ($request->has('sortBy') && $request->sortBy == 'like') {
            $videos = $videos->leftJoin('likes', function ($join) {
                $join->on('likes.likeable_id', '=', 'videos.id')
                    ->where('likes.likeable_type', '=', 'App\\\\Models\\\\Video')
                    ->where('likes.vote');
            })->groupBy('videos.id')->select(['videos.*', DB::raw('count(likes.vote) as vote')])->orderBy('vote', 'desc');
        }
        if ($request->has('sortBy') && $request->sortBy == 'length') {
            $videos = $videos->orderBy('length', 'desc');
        }
        if ($request->has('length') && $request->length == 1) {
            $videos = $videos->where('length', '<', 60);
        }
        if ($request->has('length') && $request->length == 2) {
            $videos = $videos->whereBetween('length', [60, 300]);
        }
        if ($request->has('length') && $request->length == 3) {
            $videos = $videos->where('length', '>', 300);
        }
        $videos = $videos->paginate(18);
        $name = $category->name;
        return view('videos.index', compact('videos', 'name'));
    }
}

و برای sort براساس لایک به خطای زیر میخورم

SQLSTATE[42000]: Syntax error or access violation: 1055 'video_share3.videos.name' isn't in GROUP BY

چدین بار بررسی کردم کوئری سمت لایک‌ها رو ولی مشکلی ندیدم

از طرفی کل اطلاعات videos میخوام و نمیشه بیخیال videos.name شد

dd هم ک میگیرم کوئریم مشکلی نداره

        if ($request->has('sortBy') && $request->sortBy == 'like') {
            $videos = $videos->leftJoin('likes', function ($join) {
                $join->on('likes.likeable_id', '=', 'videos.id')
                    ->where('likes.likeable_type', '=', 'App\\\\Models\\\\Video')
                    ->where('likes.vote','=',1);
            })->groupBy('videos.id')->select(['videos.*', DB::raw('count(likes.vote) as vote')])->orderBy('vote', 'desc');
            dd($videos->dd());
        }

result

"select `videos`.*, count(likes.vote) as vote from `videos` left join `likes` on `likes`.`likeable_id` = `videos`.`id` and `likes`.`likeable_type` = ? and `likes`.`vote` = ? where `videos`.`category_id` = ? and `videos`.`category_id` is not null group by `videos`.`id` order by `vote` desc ◀
array:3 [▼ // vendor\\laravel\\framework\\src\\Illuminate\\Database\\Query\\Builder.php:3754
  0 => "App\\Models\\Video"
  1 => 1
  2 => 1
]

سلام مهدی جان

بخاطر تغییراتی که در نسخه 5.7 Mysql بوجود اومده (اینجا توضیح داده شده)، این خطا رخ داده و برای حلش باید در فایل config\\database.php قسمت modes رو به آخر آرایه mysql اضافه کنید:

'mysql' => [
       ...
       ....
       'strict' => true,
       'modes' => [
            //'ONLY_FULL_GROUP_BY', // Disable this to allow grouping by one column
            'STRICT_TRANS_TABLES',
            'ERROR_FOR_DIVISION_BY_ZERO',
            'NO_ZERO_IN_DATE',
            'NO_ZERO_DATE',
            'NO_AUTO_CREATE_USER',
            'NO_ENGINE_SUBSTITUTION'
        ],
 ]
صادق برزگر ۱۷ دی ۱۴۰۱، ۰۷:۲۴

ممنون استاد ولی ی سوال

من ی پروژه دیگه دارم ک با همین xamp کار میکنه و مشکلی نداره

Mahdi ۱۷ دی ۱۴۰۱، ۱۷:۳۲

احتمالا از groupBy استفاده نمیکنید یا جور دیگه ای استفاده میکنید.

صادق برزگر ۱۸ دی ۱۴۰۱، ۰۵:۴۵

ن استاد دقیقا groupBy شون کردم و از aggregate‌ها استفاده کردم

Mahdi ۱۸ دی ۱۴۰۱، ۰۷:۱۲

بله درسته، همونطور که گفتم احتمالا جور دیگه ای از GROUP BY استفاده کردید.

در لینک رفرنس ا‌ی که بالاتر فرستادم، توضیح داده شده که وقتی از ORDER BY یا HAVING به همراه GROUP BY در کوئری که میزنید استفاده شده باشه و اون ستون هایی که در ORDER BY یا HAVING گفتم استفاده بشه و اون ستون‌ها nonaggregated باشند ولی در GROUP BY استفاده نشه، کوئری رو ریجکت یا به اصطلاح رد میکند و اجرا نمیشه.

صادق برزگر ۱۸ دی ۱۴۰۱، ۰۸:۲۴

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

استاد من ی پروژه لاراول clone کردم از گیت هاب

دستور

$ composer self-update

میزنم به خطای

  curl error 28 while downloading https://getcomposer.org/versions: Operation timed out after 10004 milliseconds with 0 out of 0   
  bytes received

میخورم

Mahdi ۱۸ دی ۱۴۰۱، ۱۰:۵۶

مهدی جان، بعد از اینکه پروژه رو clone کردید، باید از دستور composer install استفاده کنید تا موارد لازم برای پروژه نصب بشه.

صادق برزگر ۱۸ دی ۱۴۰۱، ۱۱:۰۶

composer install استاد این دستور ک میزنم از صفر همه چی رو میخواد از اسم پروژه تا لایسنس و require‌ها

و بعد از نصب هم اتفاق خاصی نمیفته

Mahdi ۱۸ دی ۱۴۰۱، ۱۱:۰۸

بخاطر وضعیت نامناسب اینترنت هستش که بعد از اجرای دستور composer self-update خطا داده شده، از یک وی پی ان مناسب استفاده کنید احتمالا مشکلتون در این رابطه حل خواهد شد.

در مورد اینکه بعد از دستور composer install ازتون اسم پروژه و ... رو میخواد، احتمالا یا در مسیر درستی دستور رو اجرا نمیکنید یا اون پروژه فایل composer.json نداره.

صادق برزگر ۱۸ دی ۱۴۰۱، ۱۱:۱۴

c1fa-rr.png

از کامند لاین vscode استفاده کردم مسیرم مسیر پروژه س require‌ها رو هم نصب نمیکنه

Mahdi ۱۸ دی ۱۴۰۱، ۱۱:۱۹

لطفا لینک پروژه ای که کلون کردید رو بفرستید.

صادق برزگر ۱۸ دی ۱۴۰۱، ۱۱:۲۴

خدمت شما البته نسخه php من متفاوت بود تغیرش دادم بازم اثر نکرد

https://uupload.ir/view/co-funder-personal-website_45ei.rar/
Mahdi ۱۸ دی ۱۴۰۱، ۱۲:۱۴

لینک گیت هاب منظورمه آقا مهدی

صادق برزگر ۱۸ دی ۱۴۰۱، ۱۲:۱۷

استاد این پروژه روی گیت فکرکنم private باشه و منم ادمینش نیستم

حالا خدمت شما

https://github.com/stackteamorg/co-funder-personal-website.git

ببینید میتونید clone بگیرید

Mahdi ۱۸ دی ۱۴۰۱، ۱۲:۲۲

پروژه public هست و یه پروژه خام از همون لاراول هست!

بدون مشکل هم تونستم clone بگیرم و همینطور با دستور composer install همه موارد لازم رو نصب کرد.

احتمالا مشکل از اینترنتتون باشه با یک وی پی ان مشکلتون حل بشه به احتمال زیاد، ضمن اینکه بهتره آخرین ورژن composer رو هم از سایتش دانلود و نصب کنید.

موفق باشید.

بهترین پاسخ
صادق برزگر ۱۸ دی ۱۴۰۱، ۱۲:۲۷

مچکر استاد

Mahdi ۱۸ دی ۱۴۰۱، ۱۲:۲۹