gpt4 book ai didi

php - 拉维尔 : How to search child relationship

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

我觉得这可能是一个简单的问题;但我一辈子都弄不明白。我对 Laravel 比较陌生,所以请多多包涵。 (我已经翻遍了文档试图找到这个)

我有一个简单的一对多关系设置,一切都按预期工作。

Membership hasMany Members Members belongsTo Membership

在构建搜索时,我成功地搜索了 Members,但我意识到在显示结果时我需要在 Membership 中设置过期字段。我目前正在使用 Members::Query 进行搜索。我的问题是,有没有一种方法可以从子关系中提取父信息,而不必重写所有搜索逻辑并且(畏缩)必须提交单独的查询来提取每个父记录?

相关代码如下:

成员(member)模式

class Membership extends Eloquent {
protected $table = 'memberships';
protected $fillable = array('expires');

public function members() {
return $this->hasMany('Member');
}
}

成员模型

class Member extends Eloquent {

protected $table = 'members';
protected $fillable = array('various','fields','here');

public function membership() {
return $this->belongsTo('Membership');
}
}

搜索功能

public function searchMember()
{
$search = Input::get('search');
$searchTerms = explode(' ', $search);
$query = Member::query();

$fields = array('firstname', 'middlename', 'lastname', 'email', 'dlnumber', 'membership_id');

foreach ($searchTerms as $term)
{
foreach ($fields as $field)
{
$query->orWhere($field, 'LIKE', '%'. $term .'%');
}
}

$results = $query->paginate(10);
return View::make('members.search')->with('results', $results);
}

如前所述,一切都按预期工作,我只需要能够从父成员关系中提取一个字段。

提前致谢!

编辑:在重新阅读我的问题后,我还想指出这是应用程序中唯一没有使用 Eloquent ORM 和预先加载的地方。如果有一种方法我可以/应该利用这些来做到这一点,那将是最好的 (imo)

最佳答案

你为此使用whereHas

Member::whereHas('membership', function ($q) {
$q->where('expiration', 'like', 'somethingToSearchFor');
})->get();

你的情况是这样的:

注意:所有那些 ifforeach 和闭包变得很困惑,所以我不会那样做,而是提取它适本地。它只是作为您应该如何构建查询的示例。

$fields = array('membership' => ['expiration'], 'firstname', 'middlename', 'lastname', 'email', 'dlnumber', 'membership_id');

// orWhereHas will use joins, so we'll start with fields foreach
foreach ($fields as $relation => $field)
{
if (is_array($field))
{
// here we join table for each relation
$query->orWhereHas($relation, function ($q) use ($field, $search) {

// here we need to use nested where like: ... WHERE key = fk AND (x LIKE y OR z LIKE y)
$q->where(function ($q) use ($field, $search) {
foreach ($field as $relatedField)
{
foreach ($search as $term)
{
$q->orWhere($relatedField, 'like', "%{$term}%");
}
}
});
});
}
else
{
foreach ($search as $term)
{
$query->orWhere($field, 'like', "%{$term}%");
}
}
}

上面我们重复了 foreach ($search as $term) 而不是将它放在顶部,因为你最终会得到每个 $term 的连接$关系。就像我说的那样,重构它并提取该代码,这样您就可以将它用于不同的关系,而且它看起来不会那么困惑。

关于php - 拉维尔 : How to search child relationship,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24986491/

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