MsgAnswersController.php 6.39 KB
<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\Message;
use App\Models\User;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;

class MsgAnswersController extends Controller
{
    public function messages(Request $request) {
        $find_key = "";
        $find_cat = "";
        $Msgs = Message::with('user_from')->with('user_to'); //->with('response');

        $Msgs = $this->filter($Msgs, $request, $find_key, $find_cat);

        $Msgs = $Msgs->orderByDesc('created_at')->paginate(25);

        return view('admin.messages', compact('Msgs', 'find_key', 'find_cat'));
    }

    public function read_message(Message $message) {
        return view('admin.message-read', compact('message'));
    }

    public function filter($Msgs, Request $request, &$find_key, &$find_cat)  {
        if (isset($request->find)) {
            $find_key = $request->find;
            $Msgs = $Msgs->where(function($q) use ($find_key) {
                $q->whereHas('user_from',
                    function (Builder $query) use ($find_key) {
                        $query->where('name', 'LIKE', "%$find_key%");
                    }
                )->
                orWhereHas('user_to',
                    function (Builder $query) use ($find_key) {
                        $query->where('name', 'LIKE', "%$find_key%");
                    }
                );
            });
        }

        if (isset($request->category)) {
            $find_cat = $request->category;

            switch ($find_cat) {
                case 'Работодатели':
                    $Msgs = $Msgs->where(function($q) {
                        $q->whereHas('user_to',
                            function (Builder $query) {
                                $query->where('is_worker', '0');
                            }
                        )->orwhereHas('user_from',
                            function (Builder $query) {
                                $query->where('is_worker', '0');
                            }
                        );
                    });
                    break;
                case 'Соискатели':
                    $Msgs = $Msgs->where(function($q) {
                        $q->whereHas('user_to',
                            function (Builder $query) {
                                $query->where('is_worker', '1');
                            }
                        )->orwhereHas('user_from',
                            function (Builder $query) {
                                $query->where('is_worker', '1');
                            }
                        );
                    });
                    break;
                case 'Администраторы':
                    $Msgs = $Msgs->where(function($q) {
                        $q->whereHas('user_to',
                            function (Builder $query) {
                                $query->where('admin', '1');
                            }
                        )->orwhereHas('user_from',
                            function (Builder $query) {
                                $query->where('admin', '1');
                            }
                        );
                    });
                    break;
                default:break;
            }
        }

        return $Msgs;

    }

    public function admin_messages(Request $request) {
        if ($request->ajax()) {
            $msg = Message::find($request->id);
            $msg->flag_new = !($request->flag_new);
            $msg->save();
        }

        $id_admin = Auth::user()->id;
        $users = User::query()->OrderBy('name')->where('is_bd', '=', '0')->get();

        $Msgs = Message::with('user_from')->with('user_to') //->with('response')
                                ->where(function($query) use ($id_admin) {
                                    $query->where('user_id', '=', $id_admin)
                                        ->orWhere('to_user_id', '=', $id_admin);
                                });

        $find_key = '';
        $find_cat = '';

        $Msgs = $this->filter($Msgs, $request, $find_key, $find_cat);

        $Msgs = $Msgs->orderByDesc('created_at')->paginate(5);

        if ($request->ajax())
            return view('admin.message.index_ajax', compact('Msgs', 'id_admin', 'users'));
        else
            return view('admin.message.index', compact('Msgs', 'id_admin', 'users', 'find_key', 'find_cat'));
    }

    public function messages_sql(Request $request) {
        $id = Auth::user()->id;
        DB::enableQueryLog();
        //$query = DB::select('select * from users where id = :id', ['id' => 1]);
        $query = DB::select(DB::raw('SELECT u1.name as "To-user", u2.name as "From-user", m1.`text`, m1.created_at
                                    FROM messages m1
                                    JOIN (SELECT MAX(id) id FROM messages
                                              GROUP BY LEAST(user_id, to_user_id),
                                              GREATEST(user_id, to_user_id)
                                        ) m2 USING (id)
                                    JOIN users u1 ON u1.id = m1.user_id
                                    JOIN users u2 ON u2.id = m1.to_user_id
                                    Where ((m1.user_id = :uid) or (m1.to_user_id = :uid2))
                                    '), ['uid' => $id, 'uid2' => $id]);
        //dump(DB::getQueryLog());
        dd($query);
        return;
    }

    public function admin_messages_post(Request $request) {
        $rules = [
            'title' => 'required|min:3|max:255',
            'text' => 'required|min:1'
            ];

        $messages = [
            'required' => 'Поле не может быть пустым!',
        ];

        $validator = Validator::make($request->all(), $rules, $messages);

        if ($validator->fails()) {
            return redirect()->route('admin.admin-messages')->withErrors($validator);
        } else {
            $params = $request->all();
            $id_admin = Auth::user()->id;
            if ($request->has('file')) {
                $params['file'] = $request->file('file')->store("upload/".$id_admin, 'public');
            }
            Message::create($params);
            return  redirect()->route('admin.admin-messages');
        }
    }
}