easy-swoole / orm

31 stars 27 forks source link

1.4.4版本with在all()时失效 #113

Closed tioncico closed 4 years ago

tioncico commented 4 years ago

2表结构为:

用户列表

user_list

群用户列表

group_user_list

GroupUserModel代码:

<?php

namespace App\Model\UserGroup;

use App\Model\User\UserModel;
use EasySwoole\Mysqli\QueryBuilder;

/**
 * Class GroupUserModel
 * Create With Automatic Generator
 * @property $groupUserId int |
 * @property $groupId int |
 * @property $groupUserHash string |
 * @property $remark string |
 * @property $userId int |
 * @property $isManager int |
 * @property $lastMsgId int |
 * @property $lastReadMsgId int |
 * @property $unreadCount int |
 * @property $state int |
 */
class GroupUserModel extends \App\Model\BaseModel
{
    protected $tableName = 'group_user_list';
    const  MANAGER = 1;
    const  NORMAL = 0;
    const STATE_NORMAL = 1;
    const STATE_DELETE = 0;

    /**
     * @getAll
     * @param  int    $page 1
     * @param  int    $pageSize 10
     * @param  string $field *
     * @return array[total,list]
     */
    public function getAll(int $page = 1, int $pageSize = 10, string $field = '*'): array
    {
        $list = $this
            ->withTotalCount()
            ->with(['userInfo'])
            ->order($this->schemaInfo()->getPkFiledName(), 'DESC')
            ->field($field)
            ->limit($pageSize * ($page - 1), $pageSize)
            ->all();
        $total = $this->lastQueryResult()->getTotalCount();;
        return ['total' => $total, 'list' => $list];
    }

    function userInfo()
    {
        return $this->hasOne(UserModel::class, function (QueryBuilder $builder) {
            $field = [
                'userHash',
                'account',
                'nickName',
                'thumb',
            ];
            return $builder->fields($field);
        }, 'userId', 'userId');
    }
}

userModel代码:

<?php

namespace App\Model\User;

use App\Model\BaseModel;
use App\Model\Utility\SystemResourceModel;

/**
 * Class User
 * @property $userId
 * @property $userHash
 * @property $account
 * @property $password
 * @property $nickName
 * @property $thumb
 * @property $registerTime
 * @property $status
 * @package App\Model
 */
class UserModel extends BaseModel
{
    protected $tableName = 'user_list';

}

复现代码:

<?php
/**
 * Created by PhpStorm.
 * User: Tioncico
 * Date: 2019/4/14 0014
 * Time: 12:07
 */
include "./vendor/autoload.php";

\EasySwoole\EasySwoole\Core::getInstance()->initialize();
go(function () {
    $groupUserModel = new \App\Model\UserGroup\GroupUserModel();
    $data = $groupUserModel->getAll();
    /**
     * @var $va \App\Model\UserGroup\GroupUserModel
     */
    foreach ($data['list'] as $va) {
//        var_dump($va->userInfo->toArray());
//        $va->userInfo;
        var_dump($va);
        var_dump($va->toArray());
    }

    \EasySwoole\Component\Timer::getInstance()->clearAll();
});

通过 var_dump($va->userInfo->toArray());正常获取userInfo 直接打印$va->toArray(),或$va,都不存在userInfo

tioncico commented 4 years ago

额外补充,

    $list = json_encode($data['list']);
    var_dump(json_decode($list,1));

同样没有userInfo数据

xuanyanwow commented 4 years ago

低版本ORM 在定义callable时候,必须添加pk字段名

该问题由于没有查询userId 字段 所以导致在后续的映射过程出现问题

       return $this->hasOne(UserModel::class, function (QueryBuilder $builder) {
            $field = [
                'userHash',
                'account',
                'nickName',
                'thumb',
            ];
            return $builder->fields($field);
        }, 'userId', 'userId');