質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • PHP

    23036questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • FuelPHP

    552questions

    FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

FuelPHP db.phpのドライバー名がdefault以外でoil refine migrateする場合の方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 435

kuzurotto

score 395

題名の通りです。
一通りmigration実行できるようになるまでが目標です。

まず、ページでDBにアクセスして取得表示はできているようです。
WEB上でのDBアクセスは問題なさそうです。

<?php

namespace Web\Controller;

use Web\Controller\abstracts\AbstractController;
use \Fuel\Core\Response;
use \Fuel\Core\Presenter;

/**
 * サンプルを扱うコントローラー。
 *
 * @package  web
 * @extends  AbstractController
 */
class Sample extends AbstractController
{
    /**
     * WEBページを表示します。
     *
     * @access  public
     * @return  Response
     */
    public function action_index($name = null)
    {

//      echo "<pre>";
//      var_dump(Validation::forge());
//      echo "</pre>";

//        $Member = new \Provide\Model\App\Member();
//        $Member->name = 'goto';
//        $Member->save();

        $entry = \Provide\Model\App\Member::find_all();
        echo "<pre>";
        var_dump($entry);
        echo "</pre>";


        $this->template->title      = 'サンプル';
        $this->template->content    = Response::forge(Presenter::forge('sample/index')->set('name', $name));
    }
}

次に、oilでModelとMigrationを生成します。
おっと、でもこれは調べて解決できました。

MG-MacBook-Pro:model_fuelphp_migration_test MacPRO-N-GOTO$ php oil g model post title:varchar[50] body:text user_id:int
Uncaught exception Fuel\Core\PhpErrorException: A non-numeric value encountered
Callstack: 
#0 /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_migration_test/fuel/core/bootstrap.php(103): Fuel\Core\Errorhandler::error_handler(2, 'A non-numeric v...', '/Applications/M...', 1790)
#1 /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_migration_test/fuel/packages/oil/classes/generate.php(1790): {closure}(2, 'A non-numeric v...', '/Applications/M...', 1790, Array)
#2 /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_migration_test/fuel/packages/oil/classes/generate.php(1177): Oil\Generate::_find_migration_number()
#3 /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_migration_test/fuel/packages/oil/classes/generate.php(747): Oil\Generate::migration(Array, false)
#4 [internal function]: Oil\Generate::model(Array)
#5 /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_migration_test/fuel/packages/oil/classes/command.php(69): call_user_func('Oil\\Generate::m...', Array)
#6 /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_migration_test/oil(68): Oil\Command::init(Array)
#7 {main}
MG-MacBook-Pro:model_fuelphp_migration_test MacPRO-N-GOTO$ php -v
PHP 7.1.13 (cli) (built: Jan  5 2018 15:31:15) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies

phpバージョン切り替え

MG-MacBook-Pro:model_fuelphp_migration_test MacPRO-N-GOTO$ php -v
PHP 7.0.26 (cli) (built: Dec  2 2017 13:12:03) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
MG-MacBook-Pro:model_fuelphp_test_migration MacPRO-N-GOTO$ php oil g model post title:varchar[50] body:text user_id:int
    Creating model: /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/fuel/app/classes/model/post.php
    Creating migration: /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/fuel/app/migrations/001_create_posts.php

問題はここからでmigration実行できません。

MG-MacBook-Pro:model_fuelphp_test_migration MacPRO-N-GOTO$ php oil refine migrate
Uncaught exception Fuel\Core\Database_Exception: invalid data source name
Callstack: 
#0 /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/fuel/core/classes/database/pdo/connection.php(171): Fuel\Core\Database_PDO_Connection->connect()
#1 /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/fuel/core/classes/database/schema.php(177): Fuel\Core\Database_PDO_Connection->query(1, 'SELECT * FROM `...', false)
#2 [internal function]: Fuel\Core\Database_Schema->table_exists('migration')
#3 /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/fuel/core/classes/database/connection.php(309): call_user_func_array(Array, Array)
#4 /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/fuel/core/classes/dbutil.php(387): Fuel\Core\Database_Connection->schema('table_exists', Array)
#5 /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/fuel/core/classes/migrate.php(667): Fuel\Core\DBUtil::table_exists('migration')
#6 /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/fuel/core/classes/migrate.php(74): Fuel\Core\Migrate::table_version_check()
#7 [internal function]: Fuel\Core\Migrate::_init()
#8 /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/fuel/core/classes/autoloader.php(377): call_user_func('Migrate::_init')
#9 /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/fuel/core/classes/autoloader.php(249): Fuel\Core\Autoloader::init_class('Migrate')
#10 [internal function]: Fuel\Core\Autoloader::load('Migrate')
#11 /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/fuel/core/tasks/migrate.php(283): spl_autoload_call('Migrate')
#12 /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/fuel/core/tasks/migrate.php(197): Fuel\Tasks\Migrate::_run('default', 'app')
#13 /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/fuel/core/base56.php(37): Fuel\Tasks\Migrate->__call('_run', Array)
#14 /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/fuel/packages/oil/classes/refine.php(108): call_fuel_func_array(Array, Array)
#15 [internal function]: Oil\Refine::run('\\Fuel\\Tasks\\Mig...', Array)
#16 /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/fuel/packages/oil/classes/command.php(126): call_user_func('Oil\\Refine::run', 'migrate', Array)
#17 /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/oil(68): Oil\Command::init(Array)
#18 {main}

そもそもWEB上でDBアクセスは問題ないのでinvalid data source nameの意味が分からないのですが
development/db.phpはこうなってます。
ローカルなので公開しても問題ないので、、、

<?php
/**
 * The development database settings. These get merged with the global settings.
 */

return array(
    // 更新系
    'master_apps' => array(
        'connection'     => array(
            'dsn'            => 'mysql:host=localhost;dbname=fuel_master_apps',
            'username'       => 'root',
            'password'       => 'root',
        ),
    ),
    'master_logs' => array(
        'connection'     => array(
            'dsn'            => 'mysql:host=localhost;dbname=fuel_master_logs',
            'username'       => 'root',
            'password'       => 'root',
        ),
    ),
    'master_users' => array(
        'connection'     => array(
            'dsn'            => 'mysql:host=localhost;dbname=fuel_master_users',
            'username'       => 'root',
            'password'       => 'root',
        ),
    ),
    // 参照系
    'slave_apps' => array(
        'connection'     => array(
            'dsn'            => 'mysql:host=localhost;dbname=fuel_slave_apps',
            'username'       => 'root',
            'password'       => 'root',
        ),
    ),
    'slave_logs' => array(
        'connection'     => array(
            'dsn'            => 'mysql:host=localhost;dbname=fuel_slave_logs',
            'username'       => 'root',
            'password'       => 'root',
        ),
    ),
    'slave_users' => array(
        'connection'     => array(
            'dsn'            => 'mysql:host=localhost;dbname=fuel_slave_users',
            'username'       => 'root',
            'password'       => 'root',
        ),
    ),
);

localhostを127.0.1にしてもダメです。
http://fuelphp.jp/docs/1.7/classes/database/dbutil.html
を参考に

<?php

namespace Fuel\Migrations;

class Create_posts
{
    public function up()
    {
//これを追加。
        \DBUtil::set_connection('master_apps');

        \DBUtil::create_table('posts', array(
            'id' => array('constraint' => 11, 'type' => 'int', 'auto_increment' => true, 'unsigned' => true),
            'title' => array('constraint' => 50, 'type' => 'varchar'),
            'body' => array('type' => 'text'),
            'user_id' => array('constraint' => 11, 'type' => 'int'),
            'created_at' => array('constraint' => 11, 'type' => 'int', 'null' => true),
            'updated_at' => array('constraint' => 11, 'type' => 'int', 'null' => true),

        ), array('id'));
    }

    public function down()
    {
        \DBUtil::drop_table('posts');
    }
}


でもダメです。
お力お貸しくださいませ。。。

追記。
まだ解決していませんが、とりあえず原因はわかりました。
invalid data source name

やっぱりこれで、oil createしてからまっさらな状態でdb.phpのドライバー名もdefaultのままで中身だけちゃんとアクセスできるようにして
php oil g model post title:varchar[50] body:text user_id:int
でmigrationファイル作って、
php oil refine migrate
したらマイグレーションできた。

で、defaultをtestに変えたら上記エラー文のinvalid data source nameがでた。

default削除してるし、下記の6つにしてるからinvalid data sourceになるわけだ。

master_apps
master_logs
master_users
slave_apps
slave_logs
slave_users

で、defaultじゃない場合どうやって設定するのかってところでつまづいてまする。

追記。
ジャストヒット。
http://improve-future.com/fuelphp-migration-to-multi-database.html

#タグ
db.phpのドライバー名がdefault以外でoil refine migrateする場合の方法

同じエラーにあってすぐ解決できなかったので具体的に。

return array(
// defaultは最初からあるやつ。localhostじゃなくて127.0.0.1にすること。
    'default' => array(
        'connection'  => array(
            'dsn'        => 'mysql:host=127.0.0.1;dbname=fuel_master_apps',
            'username'   => 'root',
            'password'   => 'root',
        ),
    ),
// defaultからdefaulにした。localhostじゃなくて127.0.0.1にすること。typeとtable_prefixを追加すること。
    'defaul' => array(
        'type'        => 'pdo',
        'connection'  => array(
            'dsn'        => 'mysql:host=127.0.0.1;dbname=fuel_master_users',
            'username'   => 'root',
            'password'   => 'root',
        ),
        'table_prefix'   => '',
    ),
);


typeとtable_prefix以外があると動かなかったり。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

質問の追記を参照。質問の追記を参照。
default削除したらあかんっぽい。
defaultにdefaulなどがオーバーライドされてるっぽい。
defaultもちゃんとなにかしら設定しとかないとダメっぽい。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • PHP

    23036questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • FuelPHP

    552questions

    FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。