首页 > 解决方案 > 仅在一行中的条件下对对象调用 PHP 函数

问题描述

在 PHP 中我想在一个对象上调用一个函数:

$something->function1()->function2();

现在function2应该只在变量$decision为时调用true

所以像:

$something->function1();
if($decision)
    $something->function2();

但我很好奇这是否可能仅在一行中实现。所以总的来说更漂亮。

语境:

在 PHP 原则中,我有一个 QueryBuilder 并且有一个where子句,只有在变量$decisiontrue.
想法:选择一些东西,但当决定为真时,还要添加第二个 WHERE 部分。

[...]
->withQueryBuilder(
    $this->getEntityManager()->createQueryBuilder()
        ->select('s')
        ->from(SomeEntity::class, 's')
        ->where('s.public = true')
        ->whereAnd('s.decision = true')
)
[...]

并且这里->whereAnd('e.decision = true')应该只在$decisionis时执行true
这里的问题是,我不能简单地添加一个 if 语句,因为该函数withQueryBuilde()只允许一个参数。

更新

我也尝试过这样的事情:

[...]
->withQueryBuilder(
    function(){
        return $this->getEntityManager()->createQueryBuilder()
            ->select('s')
            ->from(SomeEntity::class, 's')
            ->where('s.public = true')
            ->whereAnd('s.decision = true');
    }
)
[...]

Call to undefined method Closure::expr()

标签: php

解决方案


好吧,我认为你想做的事情没有任何意义,但如果你真的想要,如果你可以向 QueryBuilder 添加一个什么都不做的函数,那么可能会有解决方案。那么你也能

$this->getEntityManager()->createQueryBuilder()
        ->select('s')
        ->from(SomeEntity::class, 's')
        ->where('s.public = true')
        ->{$decision ? 'whereAnd' : 'doNothing'}('s.decision = true');

您还可以修改参数,对查询没有影响

->whereAnd($decision ? 's.decision = true' : 'true=true' )

尽管如此,你还是应该简单地使用 normal if,除非你打赌你可以在一行中做到这一点。


推荐阅读