【问题标题】:Querying Relationships in Laravel 5.2在 Laravel 5.2 中查询关系
【发布时间】:2015-12-23 12:16:24
【问题描述】:

我在尝试查询 Eloquent 关系时遇到问题。

我有两张桌子

tbl_deals

  • 身份证
  • deal_id
  • merchant_id

tbl_merchants

  • 身份证
  • merchant_id
  • merchant_url_text

我将交易模型定义为

class deal extends Model
{
    public function merchant() {
        return $this->hasOne('App\merchant', 'merchant_id', 'merchant_id');
    }
}

现在,我想根据其中的 Mercer_url_text = 我的控制器中的变量查询所有交易

这就是我正在尝试的方法

$deals = deal::with('merchant')->get(); //Retrieving all the deals with merchants 

如果我返回 $deals,它会给我所有与商家关系的交易。

我如何通过说 where Mercer_url_text = $variable 来限制交易

我在努力

return $deals->where('merchant_url_text', $merchant_url_text)->get();

但它给了我一个错误说:

“缺少 Illuminate\Support\Collection::get() 的参数 1,在 ... 中调用”

我尝试在 Laravel Docs 中查找用于查询关系的文档。它谈到了这个例子

$user = App\User::find(1);

$user->posts()->where('active', 1)->get();

在这种情况下,它试图获取第一个用户并找到与该用户相关的相应帖子。

在我的情况下,我想从所有交易中过滤掉,即在我的控制器中具有 Mercer_url_text = 特定变量的交易。

对我如何实现这一点有任何帮助吗?

谢谢

【问题讨论】:

    标签: laravel-5.1 laravel-5.2


    【解决方案1】:

    试试下面的代码:

    $specific_merchant_url_text = "i don't know";
    $deals_with_specific_merchant_url_text = [];
    $deals = deal::with('merchant')->get();
    
    foreach($deals as $deal)
         if( $deal->merchant->merchant_url_text==$specific_merchant_url_text)
              array_push($deals_with_specific_merchant_url_text, $deal);
    

    因此,您会在 deals_with_specific_merchant_url_text 中获得包含特定商家 URL 文本的一系列交易。

    另一种使用DB对象的方法:

    $deals = DB::table('deals')
            ->join('merchants', 'deals.merchant_id', '=', 'merchants.id')
            ->select('deals.*')
            ->where('merchants.merchant_url_text', $merchant_url_text)
            ->get();
    

    你的raw

    $deals = deal::selectRaw('tbl_deals.*')
             ->Join('merchants','deals.merchant_id','=','merchants.merchant_id')            
             ->where('merchants.merchant_url_text', '=', $merchant_url_text) ->get();
    

    希望这会有所帮助。

    【讨论】:

    • 工作。必须在 if 语句中将商人()更改为商人。这是执行此类操作的推荐方法吗?我也可以使用 select raw 对表进行简单的连接。你知道哪一个会更有效率吗?
    • $deals = deal::selectRaw('tbl_deals.*') ->Join('merchants','deals.merchant_id','=','merchants.merchant_id') ->where( 'merchants.merchant_url_text', '=', $merchant_url_text) ->get();这也有效。知道这种方法是否比您循环遍历所有记录以进行约束的方法更有效吗?
    • 嗨,我不确定这三个中哪一个最适合这种操作,但我推荐了最后两个中的一个,祝你好运,如果你找到我的答案如果它回答了您的问题,请将其标记为正确答案。
    【解决方案2】:

    With 接受回调。这将带回所有交易,但只有匹配的热切加载商家。

    $deals = Deal::with(['merchant' => function ($query) use ($url_text){
        return $query->where('merchant_url_text', $url_text);
    }])->get();
    

    反面:如果您只想与匹配的商家进行交易,请使用 where has。

    $deals = Deal::whereHas('merchant', function ($query) use ($url_text){
        return $query->where('merchant_url_text', $url_text);
    })->get();
    

    如果你想要两者,请将它们链接起来:

    $deals = Deal::whereHas('merchant', function ($query) use ($url_text){
        return $query->where('merchant_url_text', $url_text);
    })->with(['merchant' => function ($query) use ($url_text){
        return $query->where('merchant_url_text', $url_text);
    }])->get();
    

    我将交易大写,因为它是标准的。在您的示例中,它没有大写。

    【讨论】:

      【解决方案3】:

      您可以使用查询构建器连接查询。

      DB::table('tbl_merchants') ->加入('tbl_deals','tbl_merchants.merchant_id','=','tbl_deals.merchant_id') ->where('tbl_merchants.merchant_url_text',$merchant_url_text) ->获取();

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-04
        • 2019-01-10
        • 1970-01-01
        • 1970-01-01
        • 2016-10-26
        • 2017-03-06
        • 1970-01-01
        相关资源
        最近更新 更多