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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

2回答

1865閲覧

cakephp3を使い、DBのデータをjson形式で出力したい。

upo78

総合スコア1

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2021/08/22 08:32

前提・実現したいこと
cakephp3を使い、DBのデータをjson形式で出力したい。

発生している問題
ローカルのdocker()では動いていますが、lolipopサーバーではエラーが出ます。
stacktraceはエラー箇所をこの行と指定しています。
$company = $this->Companies->find()->where(['Companies.user_id' => $user_id]);
なので、
'Companies.user_id' => $user_id

String ⇒ Integer
となり、エラーが起きるのではないかと思い、
(string)$user_id
としたがダメでした。

エラーメッセージ
Cannot convert value of type string to integer
InvalidArgumentException
Documentation API
Could this be caused by using Auto-Tables?
Some of the Table objects in your application were created by instantiating "Cake\ORM\Table" instead of any other specific subclass.

This could be the cause for this exception. Auto-Tables are created for you under the following circumstances:

The class for the specified table does not exist.
The Table was created with a typo: $this->getTableLocator()->get('Atricles');
The class file has a typo in the name or incorrect namespace: class Atricles extends Table
The file containing the class has a typo or incorrect casing: Atricles.php
The Table was used using associations but the association has a typo: $this->belongsTo('Atricles')
The table class resides in a Plugin but no plugin notation was used in the association definition.


⟩ Cake\Database\Type\IntegerType->checkNumeric
CORE/src/Database/Type/IntegerType.php, line 117
⟩ Cake\Database\Type\IntegerType->manyToPHP
CORE/src/Database/FieldTypeConverter.php, line 140
⟩ Cake\Database\FieldTypeConverter->__invoke
CORE/src/Database/Statement/CallbackStatement.php, line 58
⟩ Cake\Database\Statement\CallbackStatement->fetch
CORE/src/ORM/ResultSet.php, line 486
⟩ Cake\ORM\ResultSet->_fetchResult
CORE/src/ORM/ResultSet.php, line 276
⟩ Cake\ORM\ResultSet->valid
CORE/src/ORM/ResultSet.php, line 298
⟩ Cake\ORM\ResultSet->first
CORE/src/Datasource/QueryTrait.php, line 472
⟩ Cake\ORM\Query->first
APP/Controller/CompaniesController.php, line 185
⟩ App\Controller\CompaniesController->getForAPI
CORE/src/Controller/Controller.php, line 606
⟩ Cake\Controller\Controller->invokeAction
CORE/src/Http/ActionDispatcher.php, line 120
⟩ Cake\Http\ActionDispatcher->_invoke
CORE/src/Http/ActionDispatcher.php, line 94
⟩ Cake\Http\ActionDispatcher->dispatch
CORE/src/Http/BaseApplication.php, line 256
⟩ Cake\Http\BaseApplication->__invoke
CORE/src/Http/Runner.php, line 65
⟩ Cake\Http\Runner->__invoke
CORE/src/Routing/Middleware/RoutingMiddleware.php, line 164
⟩ Cake\Routing\Middleware\RoutingMiddleware->__invoke
CORE/src/Http/Runner.php, line 65
⟩ Cake\Http\Runner->__invoke
CORE/src/Routing/Middleware/AssetMiddleware.php, line 88
⟩ Cake\Routing\Middleware\AssetMiddleware->__invoke
CORE/src/Http/Runner.php, line 65
⟩ Cake\Http\Runner->__invoke
CORE/src/Error/Middleware/ErrorHandlerMiddleware.php, line 100
⟩ Cake\Error\Middleware\ErrorHandlerMiddleware->__invoke
CORE/src/Http/Runner.php, line 65
⟩ Cake\Http\Runner->__invoke
CORE/src/Http/Runner.php, line 51
⟩ Cake\Http\Runner->run
CORE/src/Http/Server.php, line 97
⟩ Cake\Http\Server->run
ROOT/webroot/index.php, line 40

②ソース
public function getForTest(){

//get param
$user_id = $this->request->getParam('user_id');

//get data
$company = $this->Companies->find()->where(['Companies.user_id' => $user_id]);
if(!empty($company)){
$this->viewClass = 'Json';
$this->set('root', $company);
$this->set('_serialize', array('root'));
return;
}

class Company extends Entity
{
protected $_accessible = [
'companyname' => true,
'postalcode' => true,
'address' => true,
'person' => true,
'tel' => true,
'fax' => true,
'user_id' => true,
'note' => true,
'created' => true,
'modified' => true,
'calls' => true,
];
}

class CompaniesTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);

$this->setTable('companies'); $this->setDisplayField('id'); $this->setPrimaryKey('id'); $this->addBehavior('Timestamp'); $this->hasMany('Calls', [ 'foreignKey' => 'company_id', ]); $this->belongsTo('Users', [ 'foreignKey' => 'user_id', ]); } public function validationDefault(Validator $validator) { $validator ->integer('id') ->allowEmptyString('id', null, 'create'); $validator ->scalar('companyname') ->maxLength('companyname', 100) ->requirePresence('companyname', 'create') ->notEmptyString('companyname'); $validator ->scalar('postalcode') ->allowEmptyString('postalcode'); $validator ->scalar('address') ->maxLength('address', 200) ->allowEmptyString('address'); $validator ->scalar('person') ->maxLength('person', 50) ->allowEmptyString('person'); $validator ->requirePresence('tel', 'create') ->notEmptyString('tel'); return $validator; } public function buildRules(RulesChecker $rules) { $rules->add($rules->isUnique(['user_id', 'tel'], 'no unique tel.')); $rules->add($rules->existsIn(['user_id'], 'Users')); return $rules; }

}

補足情報(FW/ツールのバージョンなど)
ローカル:Docker, Apache2.4, php7.4, cakephp3.9.10, mysql5.7,
サーバー:lolipop, Apache2.4, php7.4, cakephp3.9.10, mysql5.6,

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

xserverで同じように環境構築したところ、無事に動きました。
サーバーの設定に問題があったのではないかと思いますが、調査する時間はありませんので、このまま進めていきます。
ありがとうございました。

投稿2021/08/22 10:39

upo78

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

upo78

2021/08/22 14:05

原因がわかりました。 Entityの変更が反映されていませんでした。 ・tmp/cache/modelsフォルダ内の該当ファイルを削除したら、問題なく動きました。 xserverには、修正後のものを一からインストールしたので、動いたのですね。 お騒がせしました。 ありがとうございました。
guest

0

本来intでくるべきのものがstringできてるからintを与えるべきというのがエラーの意図では?

Cannot convert value of type string to integer

文字列型の値を整数に変換できません(Google翻訳そのまま)

デバッグして値を確認してみてください。

投稿2021/08/22 09:53

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

upo78

2021/08/22 10:18

echo $user_id; 'Companies.user_id' => (int)$user_id 値は1が取れていて、intへの変換をしてみましたが変化ありませんでした。
m.ts10806

2021/08/22 10:39

キャストする必要はないかと(むしろキャストしなきゃいけない実装はNG)
m.ts10806

2021/08/22 10:40

PHPのバージョンの問題はあり得ます、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問