Laravel Eloquent: 如何将连接名称传递给关系模型
Laravel Eloquent: How to pass connection name to relationship model
我有两个模型,一个 mongo 模型扩展了 Jenssegers\Model,另一个 sql 模型扩展了 Illuminate\Model。此 sql 模型没有定义连接名称,因为我们有多个数据库连接,每个数据库中具有相同的 table。
Mongo 型号 Comment.php
<?php
namespace App\Models\Mongo;
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
class Comment extends Eloquent
{
/** @var string Mongo Connection Name */
protected $connection = 'mongodb';
/** @var string Mongo Collection Name */
protected $collection = 'comments';
/** @var bool Enable/Disable Timestamp */
public $timestamps = true;
/** @var date Date format */
protected $dateFormat = 'Y-m-d H:i:s';
public function userProfile()
{
return $this->belongsTo('\App\Models\Sql\UserDefaultProfile', 'created_by', 'user_code');
}
}
Sql 型号 UserProfile.php
<?php
namespace App\Models\Sql;
use Illuminate\Database\Eloquent\Model;
use Jenssegers\Mongodb\Eloquent\HybridRelations;
class UserDefaultProfile extends Model
{
use HybridRelations;
/** @var string Table Name */
protected $table = 'user_default_profile';
/** @var bool Enable/Disable Timestamp */
public $timestamps = false;
}
我有多个数据库连接添加到 Capsule
try {
$getDatabaseList = StoreDatabaseCredential::all();
} catch (Exception $exception) {
}
foreach ($getDatabaseList as $database) {
if (strtolower($database->database_type) == 'mysql') {
$db->addConnection([
'driver' => 'mysql',
'host' => $database->database_router_read_host,
'port' => $database->database_router_read_port,
'database' => $database->database_name,
'username' => $database->database_user,
'password' => $database->database_password,
'charset' => 'utf8',
'collation' => 'utf8_general_ci',
'prefix' => '',
], $database->connection_name);
}
}
因此可以使用多个数据库连接
现在的问题是,当我用关系调用 eloquent 时,得到的是 Database [Default] not configured
。我收到此错误是因为 UserProfile 模型没有定义任何连接。所以,请知道如何将连接名称传递给关系模型的人。
try {
$comments = Comment::where([
'in_reply_to_content_id' => $contentId,
'super_store_id' => $superStoreId,
'is_deleted' => 0
])->with([
'userProfile' => function ($query) use ($dbConnectionName) {
$query->select('id', 'user_code', 'mobile', 'name', 'profile_pic_url');
}
])->skip($offset)->take($itemsPerPage)->orderBy('created_at', 'desc')->get();
Utils::printData($contentComments);
exit();
} catch (\Throwable $exception) {
Utils::printData($exception->getMessage());
exit();
}
所以,是否可以用关系
做这样的事情
with([
'userProfile' => function ($query) use ($dbConnectionName) {
$query->setConnection($dbConnectionName)->select(
'id', 'user_code', 'mobile', 'name', 'profile_pic_url'
);
}
])->skip($offset)->take($itemsPerPage)->orderBy('created_at', 'desc')->get();
您可以为您的 UserProfile
模型扩展基础 Model
class,覆盖 getConnectionName 方法并从 static
[=32] 获取连接名称=] 用 static
方法设置的变量
例如:
use Illuminate\Database\Eloquent\Model;
class RelationWithChangingConnection extends Model
{
static $connectionName;
static public function setConnectionNameForRelation($connectionName)
{
static::$connectionName = $connectionName;
}
public function getConnectionName()
{
$this->connection = static::$connectionName;
return parent::getConnectionName();
}
}
class UserDefaultProfile extends RelationWithChangingConnection
{
//...
}
然后
with([
'userProfile' => function ($query) use ($dbConnectionName) {
UserDefaultProfile::setConnectionNameForRelation($dbConnectionName);
$query->setConnection($dbConnectionName)->select(
'id', 'user_code', 'mobile', 'name', 'profile_pic_url'
);
}
])...
然而,这看起来很难看。
您也可以按照建议通过切换配置文件来切换数据库连接here
UPD:我遇到了另一种可能的解决方案,但还没有检查过 - 你可以这样写你的关系子查询:
...
->with([
'userProfile' => function ($query) use ($dbConnectionName) {
$query->from('[yourdatabase].[dbtable]')->select('id','user_code', 'mobile', 'name', 'profile_pic_url');
}
...
它将连接到您设置的数据库和数据库table。
是的,如果您的模型扩展到 Illuminate\Database\Eloquent\Model;
,则可以设置连接名称
$profile = UserDefaultProfile::setConnection('your_connection_name_goes_here')->where('','')->select('');
我有两个模型,一个 mongo 模型扩展了 Jenssegers\Model,另一个 sql 模型扩展了 Illuminate\Model。此 sql 模型没有定义连接名称,因为我们有多个数据库连接,每个数据库中具有相同的 table。
Mongo 型号 Comment.php
<?php
namespace App\Models\Mongo;
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
class Comment extends Eloquent
{
/** @var string Mongo Connection Name */
protected $connection = 'mongodb';
/** @var string Mongo Collection Name */
protected $collection = 'comments';
/** @var bool Enable/Disable Timestamp */
public $timestamps = true;
/** @var date Date format */
protected $dateFormat = 'Y-m-d H:i:s';
public function userProfile()
{
return $this->belongsTo('\App\Models\Sql\UserDefaultProfile', 'created_by', 'user_code');
}
}
Sql 型号 UserProfile.php
<?php
namespace App\Models\Sql;
use Illuminate\Database\Eloquent\Model;
use Jenssegers\Mongodb\Eloquent\HybridRelations;
class UserDefaultProfile extends Model
{
use HybridRelations;
/** @var string Table Name */
protected $table = 'user_default_profile';
/** @var bool Enable/Disable Timestamp */
public $timestamps = false;
}
我有多个数据库连接添加到 Capsule
try {
$getDatabaseList = StoreDatabaseCredential::all();
} catch (Exception $exception) {
}
foreach ($getDatabaseList as $database) {
if (strtolower($database->database_type) == 'mysql') {
$db->addConnection([
'driver' => 'mysql',
'host' => $database->database_router_read_host,
'port' => $database->database_router_read_port,
'database' => $database->database_name,
'username' => $database->database_user,
'password' => $database->database_password,
'charset' => 'utf8',
'collation' => 'utf8_general_ci',
'prefix' => '',
], $database->connection_name);
}
}
因此可以使用多个数据库连接
现在的问题是,当我用关系调用 eloquent 时,得到的是 Database [Default] not configured
。我收到此错误是因为 UserProfile 模型没有定义任何连接。所以,请知道如何将连接名称传递给关系模型的人。
try {
$comments = Comment::where([
'in_reply_to_content_id' => $contentId,
'super_store_id' => $superStoreId,
'is_deleted' => 0
])->with([
'userProfile' => function ($query) use ($dbConnectionName) {
$query->select('id', 'user_code', 'mobile', 'name', 'profile_pic_url');
}
])->skip($offset)->take($itemsPerPage)->orderBy('created_at', 'desc')->get();
Utils::printData($contentComments);
exit();
} catch (\Throwable $exception) {
Utils::printData($exception->getMessage());
exit();
}
所以,是否可以用关系
做这样的事情with([
'userProfile' => function ($query) use ($dbConnectionName) {
$query->setConnection($dbConnectionName)->select(
'id', 'user_code', 'mobile', 'name', 'profile_pic_url'
);
}
])->skip($offset)->take($itemsPerPage)->orderBy('created_at', 'desc')->get();
您可以为您的 UserProfile
模型扩展基础 Model
class,覆盖 getConnectionName 方法并从 static
[=32] 获取连接名称=] 用 static
方法设置的变量
例如:
use Illuminate\Database\Eloquent\Model;
class RelationWithChangingConnection extends Model
{
static $connectionName;
static public function setConnectionNameForRelation($connectionName)
{
static::$connectionName = $connectionName;
}
public function getConnectionName()
{
$this->connection = static::$connectionName;
return parent::getConnectionName();
}
}
class UserDefaultProfile extends RelationWithChangingConnection
{
//...
}
然后
with([
'userProfile' => function ($query) use ($dbConnectionName) {
UserDefaultProfile::setConnectionNameForRelation($dbConnectionName);
$query->setConnection($dbConnectionName)->select(
'id', 'user_code', 'mobile', 'name', 'profile_pic_url'
);
}
])...
然而,这看起来很难看。 您也可以按照建议通过切换配置文件来切换数据库连接here
UPD:
...
->with([
'userProfile' => function ($query) use ($dbConnectionName) {
$query->from('[yourdatabase].[dbtable]')->select('id','user_code', 'mobile', 'name', 'profile_pic_url');
}
...
它将连接到您设置的数据库和数据库table。
是的,如果您的模型扩展到 Illuminate\Database\Eloquent\Model;
,则可以设置连接名称$profile = UserDefaultProfile::setConnection('your_connection_name_goes_here')->where('','')->select('');