Добавление информации в БД методом create(). В файле \app\Http\Controllers\Admin\Core.php:
public function getArticles() {
$articles = Article::create(
[
'name'=>'Hello world!',
'text'=>'Text of the Hello world',
'img'=>'hello.jpg',
]
);
$articles = Article::all();
dump($articles);
}
Если мы используем метод create(), то сначала фреймворку нужно указать список полей, в которые разрешается добавление информации. Иначе он будет выдавать ошибку MassAssignmentException.
Для этого в модели надо переопределить одно свойство $fillable. Идем в app/Article.php
class Article extends Model
{
// protected $table = 'articles'; // указываем имя таблицы БД. Это необязательное свойство, если имя модели совпадает с именем таблицы.
protected $primaryKey = 'id'; // По умолчанию это id. Если это не так, то нужно указать поле.
public $incrementing = TRUE; // Автоинкремент.
public $timestamps = TRUE; // Для автозаполнения полей даты создания и даты изменения.
protected $fillable = ['name', 'text', 'img']; // массив, который содержит список полей, доступных для записи
}
Свойство $guarded содержит список полей недоступных для записи.
protected $guarded = ['*']; // все поля таблицы запрещены для записи
В нашем случае:
protected $fillable = ['name', 'text']; // массив, который содержит список полей, доступных для записи
protected $guarded = ['img']; // какое поле запрещено для записи
Добавление информации в БД методом firstOrCreate() - добавление уникальной информации по определенному полю.
Этот метод сначала проверяет есть ли уже такая же запись. И запись была, то она не будет добавлена повторно.
В файле \app\Http\Controllers\Admin\Core.php:
public function getArticles() {
$articles = Article::firstOrCreate(
[
'name'=>'Hi!',
'text'=>'Text of the Hi'
]
);
$articles = Article::all();
dump($articles);
}
Добавление информации в БД методом firstOrNew() - помогает добавлять информацию в БД. После этого метода используется метод save().
Сначала он проверит есть ли в БД запись с такими данными. Если есть, то firstOrNew() возвращает объект модели.
Если такой записи нет, то firstOrNew() возвращает объект модели для данных параметров. Но вставки информации в БД не происходит!
А после этого вызываем метод save().
public function getArticles() {
$article = Article::firstOrNew(
[
'name'=>'Hi3!',
'text'=>'Text of the Hi3'
]
);
$article->save();
$articles = Article::all();
dump($articles);
}
Удаление информации из БД методом delete(). Удаляется запись, которая соответствует данной модели.
public function getArticles() {
$article = Article::find(19);
$article->delete();
$articles = Article::all();
dump($articles);
}
Можно не выбирать записи, а удалить их сразу методом destroy().
public function getArticles() {
Article::destroy(18);
$articles = Article::all();
dump($articles);
}
Можно удалить сразу несколько записей. Для этого нужно передать массив.
Article::destroy([16, 17]);
Для удаления можно использовать конструкторы запросов:
Article::where('id', '>', '13')->delete();
Мягкое удаление похожее на корзину операционной системы Windows.
Записи из БД физически не удаляются, но при этом в таблицу нужно добавить дополнительное поле.
Создадим миграцию в консоли: php artisan make:migration change_article_table_soft --table=articles
Идем в файл database\migrations\2017_07_12_170959_change_article_table_soft.php
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class ChangeArticleTableSoft extends Migration
{
public function up()
{
Schema::table('articles', function (Blueprint $table) {
$table->softDeletes();
});
}
public function down()
{
Schema::table('articles', function (Blueprint $table) {
$table->dropColumn('deleted_at');
});
}
}
Применим миграцию: php artisan migrate
После этого в БД появляется колонка deleted_at.
Идем в модель app/Article.php и добавляем трейт.
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Article extends Model
{
use SoftDeletes;
// protected $table = 'articles'; // указываем имя таблицы БД. Это необязательное свойство, если имя модели совпадает с именем таблицы.
protected $primaryKey = 'id'; // По умолчанию это id. Если это не так, то нужно указать поле.
public $incrementing = TRUE; // Автоинкремент.
public $timestamps = TRUE; // Для автозаполнения полей даты создания и даты изменения.
protected $fillable = ['name', 'text']; // массив, который содержит список полей, доступных для записи
protected $guarded = ['img']; // какое поле запрещено для записи
protected $dates = ['deleted_at'];
}
Адрес для трейта SoftDeletes: \vendor\laravel\framework\src\Illuminate\Database\Eloquent\SoftDeletes.php
В файле \app\Http\Controllers\Admin\Core.php:
public function getArticles() {
$article = Article::find(13);
$article->delete();
$articles = Article::all();
dump($articles);
}
В БД статья остается, а в колонке deleted_at появляется время.
Но в коллекции статья больше не отображается. Запись помещена в корзину.
Как ее можно вытащить обратно? Для этого применим метод withTrashed().
public function getArticles() {
$articles = Article::withTrashed()->get(); // выбираем все записи вместе с удаленными.
dump($articles);
}
Проверим какие записи были удалены:
public function getArticles() {
$articles = Article::withTrashed()->get(); // выбираем все записи вместе с удаленными.
foreach($articles as $article) {
// если статья была удалена в корзину
if($article->trashed()) {
echo $article->id.' Удалена <br />';
}
else {
echo $article->id.' Неудалена <br />';
}
}
dump($articles);
}
Восстановление удаленных записей методом restore().
public function getArticles() {
$articles = Article::withTrashed()->restore(); // восстановим удаленные записи.
dump($articles);
}
Либо так:
public function getArticles() {
$articles = Article::onlyTrashed()->restore(); // восстановим удаленные записи.
dump($articles);
}
В БД в колонке deleted_at будет написало NULL.
Удалим запись физически при работе с мягким удалением методом forceDelete().
public function getArticles() {
$article = Article::find(13);
$article->forceDelete();
}
Спасибо, информация обобщена, все понятно.
ОтветитьУдалить