我有两个模型,一个mongo模型扩展Jenssegers \ Model和其他扩展Illuminate \ Model的sql模型。此sql模型没有定义连接名称,因为我们有多个数据库连接在每个数据库中都有相同的表。
Mongo Model 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 Model 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);
}
}
因此可以使用多个数据库连接
现在的问题是当我用关系调用雄辩时,我得到了Database [Default] not configured
。我收到此错误是因为UserProfile Model没有定义任何连接。那么,请一个能告诉如何将连接名称传递给关系模型的人。
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();
答案 0 :(得分:2)
您可以为Model
模型扩展基础UserProfile
类,覆盖getConnectionName方法,并从static
类变量获取连接名称,该变量是使用{{1}设置的方法
例如:
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
{
//...
}
然而,这看起来很难看。 您也可以通过切换配置文件来切换数据库连接,如建议here
UPD:Here我遇到了另一种可能的解决方案,但还没有检查过 - 你可以像这样编写你的关系子查询:
with([
'userProfile' => function ($query) use ($dbConnectionName) {
UserDefaultProfile::setConnectionNameForRelation($dbConnectionName);
$query->setConnection($dbConnectionName)->select(
'id', 'user_code', 'mobile', 'name', 'profile_pic_url'
);
}
])...
它将连接到您设置的数据库和数据库表。
答案 1 :(得分:-1)
是的,如果您的模型扩展到Illuminate \ Database \ Eloquent \ Model,则可以设置连接名称;
$profile = UserDefaultProfile::setConnection('your_connection_name_goes_here')->where('','')->select('');