gpt4 book ai didi

php - 如何自定义 Laravel 的 Database\Query\Builder(做更好的子查询)

转载 作者:可可西里 更新时间:2023-10-31 23:08:00 25 4
gpt4 key购买 nike

我正在研究 Laravel 4。据我所知,我可以做子查询:

Project::whereIn('project_id', function($q) {
$q->select('project_id')
->from('company')
->whereNull('deleted_at');
});

我发现了复杂性,我不能在子查询中使用范围和禁用 soft_delete 使我更改源代码太多。

我希望它是:

Project::whereIn('project_id', function(&$q) {
$q = Company::select('project_id')->getQuery();
});

现在,我可以添加作用域,轻松禁用 soft_delete。

我尝试并找到了一个解决方案,我必须更改 Laravel 的 Database\Query\Builder 代码,函数 whereInSub,第 786 行。

call_user_func($callback, $query = $this->newQuery());

到:

$query = $this->newQuery();
call_user_func_array($callback, array(&$query));

修改 Laravel 框架的供应商是有害的。所以我想问一下如何安全地做。

对不起,因为我的英语不好。

感谢阅读。

最佳答案

哦哦!这是一个非常棘手的问题,因为您的模型会扩展 Eloquent , 然后 Eloquent使用 Illuminate\Database\Query\Builder .

但我注意到的是 Eloquent实际上是app/config/app.php中的别名文件。因此,您可以按照以下步骤操作。

  1. 扩展Illuminate\Database\Query\BuilderMyQueryBuilder与您的定制 whereInSub() .
  2. 扩展Illuminate\Database\Eloquent\ModelMyModel并使其成为use你的MyQueryBuilder .
  3. 设置Eloquent别名 app/config/app.php给你的新MyModel类。

像这样:

MyQueryBuilder.php:

use Closure;
use Illuminate\Support\Collection;
use Illuminate\Database\ConnectionInterface;
use Illuminate\Database\Query\Grammars\Grammar;
use Illuminate\Database\Query\Processors\Processor;

class MyQueryBuilder extends Illuminate\Database\Query\Builder
{
protected function whereInSub($column, Closure $callback, $boolean, $not)
{
$type = $not ? 'NotInSub' : 'InSub';

$query = $this->newQuery(); // Your changes
call_user_func_array($callback, array(&$query)); // Your changes

$this->wheres[] = compact('type', 'column', 'query', 'boolean');

$this->mergeBindings($query);

return $this;
}
}

MyModel.php:

use DateTime;
use ArrayAccess;
use Carbon\Carbon;
use LogicException;
use Illuminate\Events\Dispatcher;
use Illuminate\Database\Eloquent\Relations\Pivot;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\MorphTo;
use Illuminate\Support\Contracts\JsonableInterface;
use Illuminate\Support\Contracts\ArrayableInterface;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Database\Eloquent\Relations\MorphOne;
use Illuminate\Database\Eloquent\Relations\MorphMany;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
// use Illuminate\Database\Query\Builder as QueryBuilder;
use Illuminate\Database\Eloquent\Relations\MorphToMany;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasManyThrough;
use Illuminate\Database\ConnectionResolverInterface as Resolver;
use MyQueryBuilder as QueryBuilder; // MyModel should now use your MyQueryBuilder instead of the default which I commented out above

abstract class MyModel extends Illuminate\Database\Eloquent\Model
{

}

app/config/app.php:

'aliases' => array(
...
'Eloquent' => 'MyModel',
...
);

请注意,我列出了很长的 use 列表上面因为"use" keyword does not get inherited .我也没有放 MyQueryBuilderMyModel为了简单起见,在命名空间中。我的use根据我们使用的 Laravel 版本,列表也可能与您的不同,因此请也检查用途。

关于php - 如何自定义 Laravel 的 Database\Query\Builder(做更好的子查询),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24555025/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com