質問 > 管理機能 > ターミナルからapp/consoleを使ってDBの処理をしたい |
管理機能
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
kore |
投稿日時: 2017/9/27 15:35
対応状況: −−−
|
半人前 登録日: 2017/9/26 居住地: 投稿: 22 |
ターミナルからapp/consoleを使ってDBの処理をしたい [EC-CUBE] 3.0.15
[レンタルサーバ] ゼンロジック [OS] CentOS 6.7 [PHP] 7.1 [データベース] MySQL 5.6 [WEBサーバ] Apache 2.2.x [ブラウザ] Google Chrome [導入プラグインの有無] プラグインジェネレータ、Wysiwygエディタ [実装したいこと] ターミナルからメソッドを叩いてDBの操作を行いたいのですが、方法がわかりません。 状況としては、管理画面でのDBへのカラム追加、データ挿入等は独自で出来ている状態です。そのような処理を、コマンドを叩いた際にも行いたいのですが、command?ファイルからDBを操作する書き方がわからず、困っています。 どなたかご教授いただけますと幸いです。 何卒、よろしくお願いいたします! |
468 |
投稿日時: 2017/9/27 16:35
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: ターミナルからapp/consoleを使ってDBの処理をしたい >管理画面でのDBへのカラム追加、データ挿入等は独自で出来ている状態です。
コントローラークラスでのDBの操作と基本的に書き方は変わらないと思います。 function execute()の中で、$this->app['eccube.repository.*****']やQueryBuilder等を利用してDBを利用できると思います。
|
kore |
投稿日時: 2017/9/27 17:55
対応状況: −−−
|
半人前 登録日: 2017/9/26 居住地: 投稿: 22 |
Re: ターミナルからapp/consoleを使ってDBの処理をしたい コントローラークラスでのDBの操作と変わらないんですね!ありがとうございます。一度試してはみたんですが、改めて試してみます!
|
kore |
投稿日時: 2017/9/27 20:59
対応状況: −−−
|
半人前 登録日: 2017/9/26 居住地: 投稿: 22 |
Re: ターミナルからapp/consoleを使ってDBの処理をしたい すみません!やっぱりcommandファイルからDBの操作がわからないので相談させてください。execute()の中身はこんな感じです。
$qbからgetSingleResult();まではProductRepositoryからコピペして取ってきました。 protected function execute(InputInterface $input, OutputInterface $output) { $qb = $this->createQueryBuilder('p'); $qb->addSelect(array('pc', 'cc1', 'cc2', 'pi', 'ps')) ->innerJoin('p.ProductClasses', 'pc') ->leftJoin('pc.ClassCategory1', 'cc1') ->leftJoin('pc.ClassCategory2', 'cc2') ->leftJoin('p.ProductImage', 'pi') ->innerJoin('pc.ProductStock', 'ps') ->where('p.id = :id') ->orderBy('cc1.rank', 'DESC') ->addOrderBy('cc2.rank', 'DESC'); $product = $qb ->getQuery() ->setParameters(array( 'id' => 1, )) ->getSingleResult(); $this->app = $this->getSilexApplication(); \Eccube\Util\Cache::clear($this->app,$input->getOption('all')); $output->writeln(sprintf("%s <info>success</info>", 'cache:clear')); } ターミナルから実行したところ、Uncaught Error: Call to undefined method Eccube\Command\ProductDiscountCommand::createQueryBuilder() とのエラーが表示されており、createQueryBuilder()が使えないというエラーだと思っています。 QueryBuilderが使えず困っています。そもそもの利用方法が誤っているのでしょうか?知識不足で申し訳ございませんが、ご教授いただけますと幸いです。 よろしくお願いいたします! |
468 |
投稿日時: 2017/9/28 9:55
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: ターミナルからapp/consoleを使ってDBの処理をしたい 1つの考え方かと思いますが、私が実装するのであれば、
function execute()に全ての処理を記述するのではなく、 createQueryBuilderを利用するような処理は、******Repositoryクラスにメソッドを追加し、 execute()では、あくまで******Repositoryクラスのメソッドを呼び出す形にします。 それぞれのクラスには、役割がありますので、 データベースとのやり取りは、Repositoryクラスに任せるのがスムーズではないでしょうか? Repositoryクラス内であれば、createQueryBuilderが使えないという事はないと思います。 commandクラスはcontrollerクラスと置き換えて考えると、ほとんどの事が対応できると思います。 (controllerクラスはhttpリクエストを受け取ってレスポンスを返す仕組みで commandクラスはコマンドラインから引数を受け取って結果を出力する仕組みと 私は理解しています)
|
kore |
投稿日時: 2017/9/28 10:23
対応状況: −−−
|
半人前 登録日: 2017/9/26 居住地: 投稿: 22 |
Re: ターミナルからapp/consoleを使ってDBの処理をしたい なるほど!Repositoryクラスが、MVCのモデル的な役割、ということですね・・・すみません、そこが理解できていなかったです。symfony2に関しても書籍で勉強しておりましたが、そこまで理解できておらず初歩的な質問になってしまいすみませんでした。ありがとうございます!挑戦します!
|
kore |
投稿日時: 2017/9/28 11:12
対応状況: −−−
|
半人前 登録日: 2017/9/26 居住地: 投稿: 22 |
Re: ターミナルからapp/consoleを使ってDBの処理をしたい いつまでもすみません!再度質問させてください。
commandクラスからRepositoryクラスのメソッドを呼び出す、という考え方は理解できるのですが、commandクラスからRepositoryクラスを利用する方法がわからず苦戦しています。。。 controllerクラスから利用する際には、メソッドの引数に$appが指定されており、 $Product = $app['eccube.repository.product']->find($id); という記述で利用出来ていますがcommandクラスには$appが存在していないので考えてはいるのですが詰まっております。 質問ばかりで申し訳ないですがご教授いただけますと非常にありがたいです・・・ 何卒、よろしくお願いいたします! |
468 |
投稿日時: 2017/9/28 11:18
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: ターミナルからapp/consoleを使ってDBの処理をしたい RouterCommand.php等のfunction execute()の中を確認いただくと分かると思いますが、
最初に以下の記述で$this->appにSilexApplicationクラスをセットして初期化しているかと思います。 $this->app = $this->getSilexApplication(); $this->app->initialize(); $this->app->boot();
|
kore |
投稿日時: 2017/9/28 12:04
対応状況: −−−
|
半人前 登録日: 2017/9/26 居住地: 投稿: 22 |
Re: ターミナルからapp/consoleを使ってDBの処理をしたい なるほど!!!ありがとうございます!!!
ソース確認できたので、今から試します。 毎度毎度本当にありがとうございます! |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |