Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Здравствуйте
... По окончанию стажировки возможно получения удаленной работы Junior Laravel Developer
Сколько по времени будет длиться стажировка?
Может быть внешние ключи можно установить неким более простым способом?
Судя по "mySQL 5.7-64" у вас установлен OpenServer? Там есть PhpMyadmin.
Зайдите туда, выберите вашу БД и выполните запрос
Для юзеров
alter table articles add foreign key articles_user_id_foreign (user_id) references users(id)
И для категорий
alter table articles add foreign key articles_category_id_foreign (category_id) references categories(id)
Ну и да. Вам уже написали
...внешние ключи нужны только в связке с on cascade delete, on cascade update и on cascade set null
... У меня вначале вообще не устанавливались таблицы, установил только когда перешел mySQL на 5.7-64
Документация https://laravel.com/docs/5.4/migrations#indexes
Laravel 5.4 по умолчанию использует кодировку utf8mb4, которая включает в себя поддержку смайлов "emoji"
Если вы хотите использовать mysql 5.6, то можно в AppServiceProvider => boot добавить Schema::defaultStringLength(191);
либо пойти в config => database и в настройках mysql сменить кодировку utf8mb4 на utf8 и collation на utf8_unicode_ci, но тогда поддержки "emoji" не будет...
Теперь, что касается миграции...
Мускул же вам понятно написал причину ошибки.
Вы пытаетесь добавить столбец, который уже существует в таблице.
Вы уже создавали этот столбец в предыдущей миграции, верно? Если вы действительно хотите его изменить, то добавьте ->change()
$table->integer('user_id')->unsigned()->default(1)->change();
*должен быть установлен doctrine/dbal
--
Если вам не нужно менять столбец, а нужно только связать ключи, то эту строку вообще удалите, но учтите, что для связывания user_id должен быть unsigned, иначе опять выскочит ошибка.
Как вариант, захардкодить url
return redirect('/url_form#anchor')->withInput()->withErrors($validator);
Попробуйте эмулировать метод PUT в запросе
...
url: '/change',
method: 'POST',
data: {id: item_id, public : 0, _method: 'PUT'},
...
я точно не знаю но чисто наугад могу предположить что конструктор отрабатывает до того как будет создан объект сессии и в \Session появятся какие-либо данные
Можно не проверять. Всё так и есть.
Начиная с версии 5.3, в конструкторе контроллера нельзя получить доступ к сессии и Auth::user() тоже, т.к. middlware еще не запустился.
Подобный вопрос на laracast https://laracasts.com/discuss/channels/ … onstructor
Об этом упоминается в документации здесь https://laravel.com/docs/5.3/upgrade#5. … nstructors
Еще больше про это написано здесь ну и костыль там же https://laravel-news.com/controller-con … aravel-5-3
$articles = App\Article::find($id);
@foreach($articles as $article)
<ul>
<li>{{$article->title}}</li>
<li>{{...}}</li>
<li id="time"></li>
</ul>
@endforeach
1. Про foreach одной статьи вам уже написали.
2. В цикле id="time" ? - хммм ... видимо действительно :примерный код без деталей:
Теперь по делу.
Присваивать из ПХП в javascript или перегонять что-то в json не нужно.
Как вариант, вы можете тегам li присвоить атрибут data, в который можете записать время.
Судя по вашему скрипту, вам нужен timestamp. Вот его и присвойте.
@foreach($articles as $article)
<ul>
<li>{{$article->title}}</li>
<li>{{...}}</li>
<li data-time="{{ $article->created_at->timestamp }}">{{ $article->created_at->format('Нужный вам формат') //или оставьте пустым }}</li>
</ul>
@endforeach
Далее javascript
var li_time = document.querySelectorAll('[data-time]'),timers =[];
for (var key in li_time) {
if (li_time.hasOwnProperty(key)) {
setTimer(li_time, key);
}
}
function setTimer(lis, i) {
var li = lis[i];
timers[i] = setInterval(function() {
li.innerHTML = parseInt(new Date().getTime() / 1000) - parseInt(li.dataset.time); // Или любая ваша реализация
}, 1000);
}
Вот и всё. Скрипт пробежится по вашим li и запустит setInterval с вашей реализацией для каждого элемента.
Ваш damnUploader не отправляет никакие кастомные заголовки, в том числе и не отправляет X-Requested-With (Ну вот так задумал автор)
Если вы загружаете что-то этим аплоадером, то проверять на if ($request->ajax()) нельзя, - всегда будет false.
Можно поступить по варварски
Не забываем в хедере указать токен <meta name="csrf-token" content="{{ csrf_token() }}" />
Заходите в файл jquery.damnuploader.js и на 279 строке, после xhr.open("POST", url); вставляете
xhr.setRequestHeader('X-CSRF-TOKEN', $('meta[name="csrf-token"]').attr('content'));
Если хотите на сервере проверять на ajax, то тогда нужно еще добавить строчку
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
---
Сохраняете. Чистите кеш браузера. Пробуете
Судя по картинке с заголовками, нет там X-CSRF-TOKEN.
Каким скриптом загружаете картинку?
Осмелюсь предположить, что вы картинку отправляете каким-то сторонним загрузчиком, который не использует jQuery ajax.
Потому и $.ajaxSetup не работает.
Если это так, то смотрите документацию скрипта и ищите как добавить заголовки.
Вкратце...
$users = User::where('id', '>', 100)->get();
Этот запрос и так использует индекс, т.к. при $table->increments('id') создается индекс.
$table->index('state') нужно создавать в случаях... например, если у вас в таблице с юзерами будет поле age - возраст.
И вы будете выбирать юзеров учитывая возраст.
$users = User::where('age', '>', 29)->get();
В этом случае желательно создать индекс для поля age, что бы не сканировалась вся таблица при выборке.
Выглядеть в миграции это будет так
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
....
$table->unsignedTinyInteger('age')->index();
....
Либо отдельно добавить индекс
$table->index('age');
....
$table->timestamps();
});
Создается индекс и выборка будет быстрее.
.....
В случае, если выборка будет по двум и более полям, то желательно создать уже составной индекс по этим полям.
$table->index(['age','city']);
Такой запрос будет использовать составной индекс
User::where('age', '>', 29)
->where('city', 'Москва')
->get();
В 5.0 присваивать имена маршрутам так
https://laravel.com/docs/5.0/routing#named-routes
Если вы перенаправляете на главную через ->route('/'), то в вашем случае надо в роутах написать так
Route::get('/',[
'as' => '/', 'uses' => 'WelcomeController@index'
]);
Но можно и не давать никакие имена маршрутам. В контроллере сделайте редирект на url: return redirect('/') или action.
Тем более на главную страницу...
А что вы пытаетесь сделать? Не url ли случайно передаете?
->route('route name');
Сюда передается имя маршрута. У вас назван хоть один маршрут так?
Посмотрите artisan route:list. Есть там такой? Скорее всего нет...
Но если вы хотите такое имя, то надо добавить в определении роута ->name('/')
Например
Route::get('/','IndexController@index')->name('/');
Да, в версиях ниже нет такого... видимо добавили позже, но тогда можно написать свой метод и вызвать до валидации.
class CategoryRequest extends Request
.....
public function validate()
{
$this->ВашМетод();
parent::validate();
}
private function ВашМетод()
{
if(empty($this->request->get('sysname'))) {
$this->request->set('sysname', Slug::make($this->request->get('name'), '_'));
// Ну или еще как...
}
}
public function rules()
{
return [
'id_parent' => 'exists:categories,id',
'name' => 'required',
'sysname' => 'sysname|unique:categories,sysname,'.$this->route('categories'),
'icon' => 'image'
];
}
Laravel 5.4
Request наследует FormRequest, который в свою очередь использует trait ValidatesWhenResolvedTrait там и есть пустой метод prepareForValidation
... Посмотрел 5.3 - тоже есть..
Как вариант, переопределить метод prepareForValidation() в CategoryRequest
class CategoryRequest extends Request
.....
protected function prepareForValidation()
{
if(empty($this->request->get('sysname'))) {
$this->request->set('sysname', Slug::make($this->request->get('name'), '_'));
// Ну или еще как...
}
}
public function rules()
{
return [
'id_parent' => 'exists:categories,id',
'name' => 'required',
'sysname' => 'sysname|unique:categories,sysname,'.$this->route('categories'),
'icon' => 'image'
];
}
Т.е. получается, что перед валидацией проверяем, если пустой sysname, то вставляем значение, которое нужно.
Так будет точно работать, но... возможно, можно как-то и по другому...
Стоит отменить, что длина поля int влияет только на длину вывода этого поля при выбранном атрибуте ZEROFILL, а не на допустимое значение.
Мускулю без разницы, что ему указывают в этой длине. Что int(3), что int(10) Все равно можно записать любое число c максимальным значением 4,294,967,295
Поэтому вам не нужно там ничего указывать.
При выборе, обращайте внимание только на тип поля: int, smallint, tinyint и т.д
Mysql documentation
$table->increments('id') - это (integer, unsigned), что означает четырех-байтовое целое число, диапазон чисел от 0 до 4,294,967,295
И по умолчанию длина равна 10
Память для акселераторов PHP - 128 мб
--
1с пульнул на сервер import и offers c ~9 000 товарами. Правда xml-ники эти весят каждый по ~15мб. (У вас почему-то меньше)
Далее...
set_time_limit(0); // На всякий случай
$xml = simplexml_load_file(import/offers);
....
foreach ($xml->Каталог->Товары->Товар as $product) {
$data['name'] = (string)$product->Наименование;
...
Product::updateOrCreate(
['1c_id' => (string)$product->Ид],
$data
);
}
Полет нормальный...
--
Фиг знает, что будет с 50к товарами.
Если не прокатит, то можно попробовать порциями загружать.
Бежать по xml и хранить в сессии номер итерации.
Допустим, на 1000 итерации или по max_execution_time обрывать скрипт, запускать заново и вставлять записи в базу начиная с сохраненной итерации.
Роуты тут не при чем.
Пересмотрите систему наследования.
return view('site');
Здесь вы показываете общий шаблон site, но site понятия ничего не имеет о header
Для того, что бы header показался, вам нужно показать наследника общего шаблона, а у вас это header
return view('header');
Так будет работать
--
Тем не менее, в конечном итоге, вы так делать не будете, т.к. header - это всего лишь кусок, который вы будете показывать в наследнике.
Еще раз почитайте про Blade Templates
Route::post('/ajaxController', 'AjaxController@index');
В методе @index, возможно буква e или x в русской раскладке. Либо в самом контроллере в методе такая ошибка. .
--
Не может быть такое?
1. Разве после head может идти что-то отлично от body? Почему там стоит тег header?
Да и вообще, какая-то странная у вас структура наследования ))))
Страницы 1