Как построить дерево категорий и вывести в select

Передать массив категорий.

function categoriesToTree($categories)
{
  $map = [0 => ['subcategories' => []]];

  foreach ($categories as &$category)
  {
    $category['subcategories'] = [];
    $map[$category['id']]      = &$category;
  }

  foreach ($categories as &$category)
    $map[$category['parent_id']]['subcategories'][] = &$category;

  return $map[0]['subcategories'];
}

На выходе получим

Мне необходимо было вывести все это в select.

Получившийся выше массив передаем в функцию

function build_options($categories, $level = 0)
{
  $option = '';
  foreach ($categories as $item)
  {
    $level = $item['parent_id'] == 0 ? 0 : $level + 1;

    $name = str_repeat('-', $level) . $item['name'];

    $option .= "<option value='" . $item['id'] . "' data-parent='" . $item['parent_id'] . "'>" . $name . "</option>";

    if (count($item['subcategories']) > 0)
      $option .= $this->build_options($item['subcategories'], $level);

  }

  return $option;
}

На выходе список тегов option, вставляем куда нужно и получаем.

Laravel 5.6. Monolog хранения логов в базе данных.

Данная статья не является полноценным переводом, для меня она является руководством по размещению логов в базу данных. Надеюсь кому-то она еще поможет, решить данную проблему. Если будут вопросы, пишите в комментариях, будем вместе разбираться.

Итак проблема: запись логов в базу данных.

В Laravel в коробочном решении есть логгер «Monolog». Фреймворк и библиотека позволяет нам написать собственный обработчик логов, но информации, как всегда, в русскоязычной сети недостаточно. Поиск привел меня на статью, с помощью которой мне удалось решить данную проблему, и я решил поделиться с Вами.

Читать далее Laravel 5.6. Monolog хранения логов в базе данных.

Laravel. Вывод SQL запроса.

Для отладки SQL запроса требуется посмотреть, какой запрос выполняется решение для Laravel ниже

 

$data->where(...);
$sql = $data->toSql();
$bindings = $data->getBindings();
foreach ($bindings as $binding) {
    $value = is_numeric($binding) ? $binding : "'".$binding."'";
    $sql = preg_replace('/\?/', $value, $sql, 1);
}
echo $sql;

Выведет примерно следующее.

select * from `conversions` where exists (select * from `landings` inner join `visits` on `landings`.`id` = `visits`.`landing_id` where `conversions`.`id` = `visits`.`id` and `landings`.`id` = 1) and `date` >= '2017-01-03' limit 15

 

Laravel. Specified key was too long; max key length is 767 bytes.

Этот сбой произойдет потому что UNIQUE_INDEX на поле email требует 1020 байт (255 * 4).

 

[Illuminate\Database\QueryException]                                         
 SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was t  
 oo long; max key length is 767 bytes (SQL: alter table `users` add unique `  
 users_email_unique`(`email`))                                                
                                                                              

                                                                              
 [PDOException]                                                               
 SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was t  
 oo long; max key length is 767 bytes                                         

Для решения необходимо перейти в папку config, открыть файл database.php

Для типа базы данных mysql заменить кодировку с

'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',

на

'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',

 

 

Права в Laravel 5. Часть 2.

В предыдущей статье ссылка, было написано как создать распределение прав пользователей и использование в роуторе и шаблоне. В этой стать хочу написать о том как присваивать пользователю права, а так же пример использования плагина jsTree для построения дерева прав.

Читать далее Права в Laravel 5. Часть 2.

Права в Laravel 5. Часть 1.

Хочу разобрать случай когда нужно выставлять права определенному пользователю. Например, Вы разрабатываете CRM-систему у владельца компании есть сотрудники которые имеют доступ к системе и Вам необходимо чтобы несколько сотрудников выполняли разные функции или запретить экспорт базы данных клиентов.

Читать далее Права в Laravel 5. Часть 1.

Laravel. Получить значения enum из таблицы

public static function getEnumValues($table, $column)
{
  $type = DB::select( DB::raw("SHOW COLUMNS FROM $table WHERE Field = '$column'") )[0]->Type;
  preg_match('/^enum\((.*)\)$/', $type, $matches);
  $enum = array();
  foreach( explode(',', $matches[1]) as $value )
  {
    $v = trim( $value, "'" );
    $enum = array_add($enum, $v, $v);
  }
  return $enum;
}

Передаются параметры: название таблицы и ячейка в которой содержится значение.

Laravel. Вывести список ошибок.

@if($errors->any())
    <ul class="alert alert-danger">
        @foreach($errors->all() as $error )
            <li>{{  $error  }}</li>
        @endforeach
    </ul>
@endif

 

Лучше создать файл _list.blade.php в папке errors. И подключать в любом месте с помощью include(‘errors._list’);

Как очистить кеш шаблонов в Laravel?

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

Route::post('/clear-cache', ['middleware' => ['auth', 'role:admin'], function () {
    $cachedViewsDirectory = app('path.storage') . '/framework/views/';
    if ($handle = opendir($cachedViewsDirectory)) {
        while (false !== ($entry = readdir($handle))) {
            if (strstr($entry, '..')) {
                continue;
            }
            @unlink($cachedViewsDirectory . $entry);
        }
        closedir($handle);
    }
    return 1;
}]);

 


	

Исправление ошибки при запуске команды db:seed

Содержимое ошибки

C:\xampp\php\php.exe artisan db:seed
[Illuminate\Database\QueryException]                                         
SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect string value: '\xC  
A\xF3\xF0\xFC\xE5\xF0...' for column 'name' at row 1 (SQL: insert into `cat  
egory` (`name`, `updated_at`, `created_at`) values ("���������� ������", 20  
16-09-14 14:49:44, 2016-09-14 14:49:44))

 

Чтобы исправить нужно изменить кодировку файла DatabaseSeeder.php с windows-1251 на utf-8