Различные подходы, обсуждаемые в вышеприведенных ответах, основаны на предположении, что либо пользователь знает индексы столбцов, чтобы их отбрасывать, либо подмножество, или пользователь хочет подмножить фрейм данных с использованием диапазона столбцов (например, между 'C': ' E '). pandas.DataFrame.drop (), безусловно, является возможностью подмножества данных на основе списка столбцов, определенных пользователем (хотя вы должны быть осторожны, чтобы всегда использовать копию данных и параметры inplace не должны быть True !!) [/ g2]
Другой вариант - использовать pandas.columns.difference (), который задает разницу в именах столбцов и возвращает индексный тип массива, содержащий требуемые столбцы. Ниже приведено решение:
df = pd.DataFrame([[2,3,4],[3,4,5]],columns=['a','b','c'],index=[1,2])
columns_for_differencing = ['a']
df1 = df.copy()[df.columns.difference(columns_for_differencing)]
print(df1)
Выход будет:
b c
1 3 4
2 4 5
Я не думаю, что вы можете, потому что Laravel берет миграции из папки vendor/laravel/framework/src/Illuminate/Database/Migrations/stubs
, и вы не можете изменить это, но у вас есть некоторые опции:
1) Создайте собственную команду artisan migrate:makemyown
.
2) Используйте генераторы Laravel 4 Джеффри Пута . Они позволяют создавать ваши миграции, делая:
php artisan generate:migration create_posts_table --fields="title:string, description:text"
Если у вас есть только некоторые поля, которые вам нужно начинать, а не что-то более конкретное, это работает отлично.
3) Редактируйте заглушки Laravel, но проблема в том, что как только вы composer update
, они могут быть перезаписаны композитором.
Я считаю, что нет возможности переопределить это (пока), но я думаю, что вы можете создать свою собственную команду, которая будет использовать логику Laravel. Это было создано для Laravel 5.
Сначала вам нужно создать команду Generator app/Console/Commands/Generator.php
:
<?php namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Filesystem\Filesystem;
use Symfony\Component\Console\Input\InputArgument;
class Generator extends Command
{
/**
* Command name
*
* @var string
*/
protected $name = 'generate';
/**
* Command description
*
* @var string
*/
protected $description = 'Custom object generator';
/**
* An array with all available generator classes
*
* @var array
*/
protected $types = ['request', 'model', 'middleware'];
/**
* Execute command
*
* @return mixed
*/
public function handle()
{
$type = $this->argument('type');
if (!in_array($type, $this->types)) {
return $this->error('Type must be one of: '.implode(', ', $this->types));
}
// Create new instance
$generatorClass = 'App\Console\Commands\Generators\\'.ucfirst($type);
$generator = new $generatorClass(new Filesystem());
// Each generator has "fire" method
$this->comment($generator->setClassName($this->argument('name'))->fire());
}
/**
* @return array
*/
public function getArguments()
{
return [
['type', InputArgument::REQUIRED, 'Type of class to generate: '.implode(', ', $this->types)],
['name', InputArgument::REQUIRED, 'Name of class to generate'],
];
}
}
. Затем вам нужно создать абстрактный класс для всех классов Generators app/Console/Commands/Generators/Generator.php
:
<?php namespace App\Console\Commands\Generators;
use Illuminate\Console\GeneratorCommand;
abstract class Generator extends GeneratorCommand
{
// Directory name with whole application (by default app)
const APP_PATH = 'app';
/*
* Name and description of command wont be used
* Generators Commands are not loaded via Kernel
* Name and description property has been put just to avoid Exception thrown by Symfony Command class
*/
protected $name = 'fake';
protected $description = 'fake';
/**
* Class name to generate
*
* @var string
*/
protected $className;
/**
* Returns class name to generate
*
* @return string
*/
protected function getNameInput()
{
return $this->className;
}
/**
* Returns path under which class should be generated
*
* @param string $name
* @return string
*/
protected function getPath($name)
{
$name = str_replace($this->getAppNamespace(), '', $name);
return self::APP_PATH.'/'.str_replace('\\', '/', $name).'.php';
}
/**
* Sets class name to generate
*
* @param string $name
* @return $this
*/
public function setClassName($name)
{
$this->className = $name;
return $this;
}
/**
* Execute command
*
* @return string
*/
public function fire()
{
$name = $this->parseName($this->getNameInput());
if ($this->files->exists($path = $this->getPath($name)))
{
return $this->type.' already exists!';
}
$this->makeDirectory($path);
$this->files->put($path, $this->buildClass($name));
return $this->type.' '.$this->className.' created successfully.';
}
}
В конце вы можете создать свой первый класс Generator! app/Console/Commands/Generators/Request.php
<?php namespace App\Console\Commands\Generators;
class Request extends Generator
{
/**
* Class type to generate
*
* @var string
*/
protected $type = 'Request';
/**
* Returns default namespace for objects being generated
*
* @param string $rootNamespace
* @return string
*/
protected function getDefaultNamespace($rootNamespace)
{
return $rootNamespace.'\Http\Requests';
}
/**
* Returns path to custom stub
*
* @return string
*/
public function getStub()
{
return base_path('resources').'/stubs/request.stub';
}
}
Не забудьте добавить свою команду генерации в Kernel app/Console/Kernel.php
:
<?php namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel {
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
...
'App\Console\Commands\Generator',
...
];
Поместите свои заглушки в каталог resources/stubs
. Давайте создадим первый для генератора запросов resources/stubs/request.stub
:
<?php namespace {{namespace}};
class {{class}} extends Request
{
/**
* @return bool
*/
public function authorize()
{
// CUSTOM LOGIC
return false;
}
/**
* @return array
*/
public function rules()
{
$rules = [];
// CUSTOM LOGIC
return $rules;
}
}
Затем вызовите с помощью php artisan generate request MyRequest
.
Вы можете создать свои собственные генераторы Model, Middleware, Controller и т. Д., Это очень просто - вам нужно создать новый класс генератора под app/Commands/Console/Generators
- посмотрите на генератор Request.php
, чтобы посмотреть, как он работает!
Для Laravel 5 вы отредактируете один из файлов .stub
в:
vendor/laravel/framework/src/Illuminate/Database/Migrations/stubs
Нет причин, по которым вы не можете редактировать эти файлы.
Поиск в vendor/laravel/framework/src/
для файлов .stub
, чтобы найти все другие заглушки (шаблоны), используемые мастером.
Это выполнимо довольно логично, по крайней мере, в Laravel 5
Подкласс MigrationCreator
и переопределить getStubPath()
, просто скопировав функцию из исходного класса (он будет использовать ваш подкласс __DIR__
)
<?php
namespace App\Database;
use Illuminate\Database\Migrations\MigrationCreator;
class AppMigrationCreator extends MigrationCreator
{
public function getStubPath()
{
return __DIR__.'/stubs';
}
}
Записать поставщика услуг для переопределения migration.creator
с вашим собственным подклассом (он должен быть отложенным поставщиком услуг, потому что вы не можете переопределить отложенную привязку с нетерпением):
<?php
namespace App\Database;
use Illuminate\Support\ServiceProvider;
class AppMigrationServiceProvider extends ServiceProvider
{
protected $defer = true;
public function register()
{
$this->app->singleton('migration.creator', function ($app) {
return new AppMigrationCreator($app['files']);
});
}
public function provides()
{
return ['migration.creator'];
}
}
Добавьте своего поставщика услуг в config/app.php
по умолчанию.
Наконец, скопируйте vendor/laravel/framework/src/Illuminate/Database/Migrations/stubs
рядом с подклассом MigrationCreator (в этом примере он станет app/Database/stubs
) и отредактирует шаблоны для ваших нужд.
Сохраните имена DummyClass
и DummyTable
, поскольку они будут заменены на str_replace()
, чтобы создать фактические файлы миграции.