orm的跨库关联怎么把数据库的前缀名去掉

我连接了一个新的数据库a,a里面有user_orders和user_order_goods两个表,

其中也建立了关联关系,user_order_goods里有user_order_id做关联字段,user_order里面有userOrderGoods做一对多关联,但我在页面的时候使用$order->userOrderGoods的时候,报字段名错误,显示查询的时候用了a_user_order_id这样带数据库前缀的字段,那我要在哪里设置才能把这个前缀去掉,用user_order_id做关联

JellyBool

你的 userOrderGoods是怎么定义的,试试这样:

public function userOrderGoods() {
    return $this->hasMany(Goods::class,'user_order_id');   
}

编辑线====

你还需要在 Model 当中定义:

protected $connection = 'mysql_b';

这样的意思就是需要在配置文件 database.php 中新增一个 mysql 配:

'mysql' => [
   //laravel 自带配置
],
 'mysql_b' => [
   //.....配置项
]

第二种也是可以尝试的

或者你在 Model 中这样声明table:

protected $table = 'database.table_name';
w23wwhhi 回复 JellyBool

我的写法就是第一种的,但userOrderGoods的关联方法是这样的

userOrderGoods:

public function userOrder()
    {
        return $this->belongsTo('App\Models\A\AUserOrderGoods','user_order_id','id');
    }

UserOrder:

public function userOrderGoods()
    {
        return $this->hasMany('App\Models\A\AUserOrderGoods');
    }

然后调用的时候就是

$orders = UserOrder::where('state',2)->get();
foreach($orders as $order) {
      $order->UserOrderGoods->id;
}

就说找不到a_user_order_id的字段,那是不是这种多库关联的就只能是用第二种写法的

JellyBool 回复 w23wwhhi

恩,第一种默认是同一个数据库的。夸数据库关联的话,你需要定义你的 connection:

protected $connection = 'mysql_b';

后面 稍微用 markdown 排版一下呗,这样代码好看很多 ,markdown 的教程在这:https://laravist.com/discuss/markdown/learn-to-use-markdown-21

w23wwhhi 回复 JellyBool

数据库显示的错误是这样的

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'user_order_goods.platform_user_order_id' in 'where clause' (SQL: select * from `user_order_goods` where `user_order_goods`.`platform_user_order_id` = 2 and `user_order_goods`.`platform_user_order_id` is not null)

platform就是我上面写的数据库别名,配置跟第一种写法是一样

JellyBool 回复 w23wwhhi

怎么看下来很乱的感觉,可否把你相关的 Model 的代码贴出来看看

tophgg 回复 JellyBool

大神,我想问下我现在想关联2个不同库的表,host和port都不同,我分别配置了collection,可是用join(‘database.table_name’,‘xx.id’,’=’,‘yy.id’);的时候识别不到database库。。难道是配置了prefix的问题?

w23wwhhi 回复 tophgg

有可能啊,我的是数据库名加上prefix,collection显示的时候就是显示关联的那个字段名就是带上了prefix,后来我就只能写原生sql

w23wwhhi

userOrder的model

class PlatformUserOrder extends Model
{
    protected $connection = 'lws_edu';
    protected $table = 'user_orders';
    protected $fillable = [
        'order_num',
        'user_id',
        'description',
        'account',
        'total_fee',
        'state',
        'user_consignee',
        'user_phone',
        'wx_num',
        'create_time',
        'pay_time',
        'wxpay_result_code',
        'wxpay_is_subscribe',
        'wxpay_bank_type',
        'wxpay_nonce_str',
        'is_removed',
        'transaction_id',
    ];

    public function user()
    {
        return $this->belongsTo('App\Models\LwsPlatform\PlatformUser','user_id','id');
    }

    public function userOrderGoods()
    {
        return $this->hasMany('App\Models\LwsPlatform\PlatformUserOrderGoods');
    }
}

userOrderGoods:

class PlatformUserOrderGoods extends Model
{
    protected $connection = 'lws_edu';
    protected $table = 'user_order_goods';
    protected $fillable = ['user_order_id','goods_id','order_goods_price','state','count','is_removed'];

    public function userOrder()
    {
        return $this->belongsTo('App\Models\LwsPlatform\PlatformUserOrderGoods','user_order_id','id');
    }
    
    
}
JellyBool 回复 w23wwhhi

额,这样看来,是我没理解你的需求。。。。还是你的把关系弄反了?

如果是 PlatformUserOrder 有多个 PlatformUserOrderGoods 的话,在userOrderGoods 需要这样吧:

  public function userOrderGoods()
    {
        return $this->hasMany('App\Models\LwsPlatform\PlatformUserOrderGoods','user_order_id');
    }

还是感觉你把关系弄反了,或者说没有理清楚,下面这个:

return $this->belongsTo('App\Models\LwsPlatform\PlatformUserOrderGoods','user_order_id','id');
    }

为啥又自己属于自己呢

w23wwhhi 回复 JellyBool

噢,这个是写错了,我也没看到,不好意思啊

w23wwhhi

但改过来以后还是没连接到那个platform的数据库

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'user_order_goods.platform_user_order_id' in 'where clause' (SQL: select * from `user_order_goods` where `user_order_goods`.`platform_user_order_id` = 2 and `user_order_goods`.`platform_user_order_id` is not null)
JellyBool 回复 w23wwhhi

是由于这个 platform的前缀引起的么?platform这是数据库的前缀?
你把 database.php 的 lws_edu 这个配置贴出来看看,或者你在这里不要 前缀试试

w23wwhhi

database.php:

'lws_edu'=> [
            'driver' => 'mysql',
            'host' => env('DB_HOST', 'localhost'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE_EDU', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
        ],

env

DB_DATABASE_EDU=lws_edu

感觉是不是我那个类名或者文件名加了前缀之后就有问题了?

JellyBool 回复 w23wwhhi

也有可能是,总是感觉会自己加上 platform的前缀