Laravel тонкости (памятка)

Роутер. Если нужно разом задать пути и связать их с контроллером, о можно использовать ресурсный контроллер. Для примера взьмем такой, из существующего проекта:

Route::resource('/order', 'Orders\OrdersController');

Благодаря этому рутеру, мы получим набор маршрутов:

Набор маршрутов, с соответствующим запуском методов в контроллере.

View. Шаблонизатор Blade:

@extends(‘layouts.app’) — подключение(наследование) шаблона, в данном случае шаблон: resources/view/layouts/app.blade.php

@section(‘content’) <!— HTML блок —> @endsection — создание блока ‘content ‘, для того что бы этот блок кода подключить, используется @yield(‘content’), в том участке, в котором необходимо вставить этот компонент.

Конструкция @forelse @endforelse:

@forelse ($orders as $order)

// если $orders не NULL

@forelse ($products as $product)

// если $orders NULL, а $products не NULL

@empty

// если $orders NULL и $products NULL

@endforelse

Конструкция @foreach @endforeach

@foreach ($order->partner as $partner)

<input type="text" class="form-control" name="name" placeholder="Заголовок категории" value="{{ $partner->name }}">

@endforeach

Конструкция @if @endif

@if ($order->status == 0)
    Новый
@elseif ($order->status == 10)
    Подтвержден
@elseif ($order->status == 20)
    Завершен
@else
    Статус не определен.
@endif

Создание ссылки в шаблоне:

<a href="{{route('order.edit', $order->id)}}" target="_blank">{!! $order->id !!}</a>

{{route(‘order.edit’, $order->id)}} — создается ссылка вида order/{order}/edit, где в {order} передается $order->id, и запустится метод ‘edit’ в контроллере ‘ Orders\OrdersController’. Маршруты можно посмотреть, введя команду ‘php artisan route:list’.

Так же можно создать именованый маршрут, т.е. маршрут, которому можно присвоить любое, на Ваше усмотрение, имя. Создаем роутер:

Route::get('/myorders', 'Orders\OrdersController@index')->name('myorders');

Теперь можно создать ссылку в шаблоне:

<a href="{{route('myorders')}}" target="_blank">Именованый маршрут myorders</a>

Следует упомянуть, что именованым маршрут является, т.к. задано имя маршрута в методе name(‘myorders’)

Для вывода переменных массивов или объектов, в шаблоне, используется конструкции такого вида:

{!! $wheather['temp'] !!} - выводим массив
{{ $product->price }} - вывод свойств объекта
{{ $order->products($order->id) }} - запуск метода модели, и передача аргумента

Контроллер.

Пример некотороых методов контроллера:

<?php

namespace App\Http\Controllers\Orders;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Orders\Order;
use App\Models\Partners\Partner;
use DB;

class OrdersController extends Controller
{

   public function index()
   {
        return view('orders', [
            'orders' => Order::orderBy('created_at', 'desc')->paginate(10),
            'partners' => Partner::all()->pluck('name', 'id'),
        ]);
   }

    public function edit($id)
    {
        return view('order', [
            'id'    => $id,
            'order' => Order::find($id),
            'delimiter'  => ''
          ]);
    }

    public function update(Request $request, Order $order)
    {
        $order->update($request->all());
        DB::update('update partners set name = ? where id = ?', [$request->name, $request->partner_id]);

        return  redirect()->route('order.index');
    }
}

Модель.

Пример модели:

<?php

namespace App\Models\Orders;

use Illuminate\Database\Eloquent\Model;
use App\Models\Order_products\Order_products;
use App\Models\Partners\Partner;

class Order extends Model
{

    protected $fillable = ['id','status','client_email', 'partner_id', 
        'delivery_dt', 'created_at', 'updated_at'];

    public function partner()
    {
      return $this->hasMany(Partner::class, 'id', 'partner_id');
    }

    public function products($order_id)
    {
      return self::join('order_products','orders.id', '=', 'order_products.order_id')
        ->join('products', 'order_products.product_id', '=', 'products.id')
        ->where('orders.id', $order_id)
        ->get();
    }

}

Метод partner():

public function partner()
{
    return $this->hasMany(Partner::class, 'id', 'partner_id');
}

Создает запрос вида:

select * 
from 
    `partners` 
where 
    `partners`.`id` = `orders`.`partner_id`
and 
    `partners`.`id` is not null

Т.о. можно создавать связь между таблицами.

Метод products():

public function products($order_id)
{
return self::join('order_products','orders.id', '=', 
    'order_products.order_id')
        ->join('products', 'order_products.product_id', '=', 'products.id')
        ->where('orders.id', $order_id)
        ->get();
}

Создаст запрос вида:

select * 

from 

    `orders` 

inner join 

    `order_products` 

on 

    `orders`.`id` = `order_products`.`order_id` 

inner join 

    `products` 

on 

    `order_products`.`product_id` = `products`.`idx` 

where 

    `orders`.`id` = $order_id(переданый в аргумент order_id)

Т.о. можно создать более сложную связь, таблицы ‘orders’ с таблицей ‘products’, через таблицу ‘order_products’.

Для быстрого создания модели и контроллера, можно использовать команду:

php artisan make:controller MessagesController --model=Messages

Команда создает контроллер «MessagesController» и модель «Messages»

Добавить комментарий