CakePHP 5.x中Contain关联别名不生效问题求助
CakePHP表别名设置后关联结果键名不符问题
问题详情
我为vehicle表设置了别名Vehicle,但在检索关联数据时,返回结果中的关联对象名称仍是原表名vehicle,而非预期的别名Vehicle。
Vehicle模型代码
namespace App\Model\Table; use Cake\ORM\Table; class VehicleTable extends Table { public function initialize(array $config): void { parent::initialize($config); $this->setTable('vehicle'); $this->setAlias('Vehicle'); $this->addBehavior('Timestamp'); } }
Trip模型及关联代码
namespace App\Model\Table; use App\Lib\Utility; use Cake\Collection\Collection; use Cake\ORM\Table; class TripTable extends Table { public function initialize(array $config): void { parent::initialize($config); $this->setTable('trip'); $this->addBehavior('Timestamp'); $this->belongsTo('Vehicle', [ 'foreignKey' => 'vehicle_id', ] ); } public function getDetails($driver_id,$starting_point) { $query = $this->find() ->where( [ 'Trip.user_id' => $driver_id ] ) ->where( [ 'Trip.completed' => 0 ] ) ->contain( [ 'Vehicle' ] ) ->limit( 10 ) ->offset( $starting_point * 10 ) ->orderby( [ 'Trip.id' => 'DESC' ] ); $result = $query->toArray(); return $result; } }
解决方案
方法1:规范创建实体类(推荐)
CakePHP在将结果转为数组时,默认使用实体类的小写名称作为关联数组的键,而非表别名。只需为vehicle表创建符合命名规范的实体类即可:
在src/Model/Entity/目录下创建Vehicle.php文件,内容如下:
namespace App\Model\Entity; use Cake\ORM\Entity; class Vehicle extends Entity { // 设置可访问字段,基础场景空类也可生效 protected $_accessible = [ '*' => true, 'id' => false, ]; }
创建后,CakePHP会自动匹配实体类,返回结果中的关联键名将变为Vehicle。
方法2:显式指定关联属性名
如果不想创建实体类,可以在belongsTo关联定义中添加propertyName参数,强制指定返回数组的键名:
$this->belongsTo('Vehicle', [ 'foreignKey' => 'vehicle_id', 'propertyName' => 'Vehicle' // 指定关联结果的键名 ]);
内容的提问来源于stack exchange,提问作者coderdeveloperprogrammer
相关产品推荐
相关产品推荐

