TJ *_*ill 7 has-many-through laravel
我来自Rails背景,我们可以使用正确的引用很容易地创建has_many_through.
我在这个项目中的模型:交易<=> DealsFaqs <=>常见问题解答
在交易模型中,我有:
public function faqs(){
return $this->hasManyThrough('App\Faq', 'App\DealsFaqs');
}
Run Code Online (Sandbox Code Playgroud)
DealsFaqs有:
public function deals()
{
return $this->belongsTo('App\Deal');
}
public function faqs()
{
return $this->belongsTo('App\Faq');
}
Run Code Online (Sandbox Code Playgroud)
我的Faq模型有:
public function deals(){
return $this->hasManyThrough('App\Deal', 'App\DealsFaqs');
}
Run Code Online (Sandbox Code Playgroud)
交易需要能够与N个常见问题相关联.
所以我为DealsFaqs创建了一个表,它有一个deal_id和一个faq_id字段.
我可以轻松地在交易表单页面上列出常见问题解答,但这与DealsFaqs无关.
如何输出常见问题,但通过表单提交它们,然后我可以在提交时检查控制器中的关系?
---基于更多代码和细节的请求编辑:
最终将有大约20-30个常见问题.并且越来越多的交易.当管理员创建每笔交易时,他们需要选择哪些常见问题解答与交易相关.有些是相关的,有些则不是.然后这些FAQ将输出到页面.
我假设我需要一个hasManyThrough因为我不能在交易上放一个faq_id字段,因为它在FAQ上需要很多和相同的内容.常见问题解答属于许多交易.
我在控制器中的DealCreate方法:
///////////////////
// ASSOCIATE FAQ's TO DEALS
///////////////////
if($request->faqs){
foreach($request->faqs as $key => $faq){
// Create new DealsFaqs
$entry = new \App\DealsFaqs;
// Populate it
$entry->faq_id = $faq['id'];
$entry->deal_id = $deal->id;
$entry->save(); // Save the DealsFaqs
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我目前的表格部分将常见问题解答与交易相关联:
<?php $a=0; foreach($faqs as $faq): ?>
<div class="col-sm-12">
<label>
<input type="radio" name="faqs[{{ $a }}][id]" value="{{ $faq->id }}">
{{ $faq->name }}
</label>
</div>
<?php $a++; endforeach; ?>
Run Code Online (Sandbox Code Playgroud)
当我选择1或全部时,会在我创建的deals_faqs表上创建新关系.但后来由于显而易见的原因(我不知道如何解决)但无线电不知道要保持检查,我不知道如何在控制器中访问/更新.这也是正确的做法,或者我错了关系?
你说你正在处理一个有很多直通关系的关系,据我了解,这需要 3 个独立的模型才能发挥作用。我觉得您正在处理多对多关系,因为您似乎正在处理两个模型。
正如你所说,你来自 Rails 背景,我觉得我要么犯了一个巨大的错误,不理解你的数据库关系,要么你有很多对很多,并且有很多混合在一起。
仅供参考:有很多来自 Laravel 文档的内容:
“has-many-through”关系为通过中间关系访问远程关系提供了便捷的捷径。例如,Country 模型可能通过中间 User 模型拥有许多 Post 模型。
在这里进一步阅读:https ://laravel.com/docs/5.2/eloquent-relationships#has-many-through
以及多对多:https://laravel.com/docs/5.2/eloquent-relationships#many-to-many
如果您正在使用多对多,我认为您的数据库架构应该包含三个表:
deals,faqs以及中间表deal_faq,第三个表名称遵循中间表的 laravel 约定,其中连接表的单数名称按字母顺序使用,中间使用下划线。该表deal_faq需要一个deal_idand faq_id。
然后您将需要两个模型(只有两个,而不是三个)
Deal和Faq,具有以下关系方法:
Deal模型:
public function faqs(){
return $this->belongsToMany('App\Deal');
}
Run Code Online (Sandbox Code Playgroud)
Faq模型:
public function deals(){
return $this->belongsToMany('App\Faq');
}
Run Code Online (Sandbox Code Playgroud)
现在,要利用这些,您可以执行以下操作,例如:
// get a deal
$deal = App\Deal::first(); // grab the first one in the db
// get faqs linked to deal
$deal->faqs;
// connect an faq and deal together
$faq = App\Faq::first();
$deal->attach($faq->id); // where id is the primary key attribute
Run Code Online (Sandbox Code Playgroud)
请注意,此答案假设您在定义关系时遵循 laravel 设置的约定。
我很抱歉地说,我不太完全理解您问题的这一部分:“如何输出常见问题解答,但通过表单提交它们,然后我可以在提交时检查控制器中的关系? ”
我假设您在问,如果我Faq以表格形式提交 ,我怎样才能获取 的Faq关系。在这种情况下,如果您在表单请求中使用 ,则可以执行类似的Faq操作id。
$faqId = $request->faq_id;
$faq = App\Faq::find($faqId);
$deals = $faq->deals;
Run Code Online (Sandbox Code Playgroud)
由于您没有展示太多代码,所以很难说,我做了很多假设。无论如何,希望这对您有所帮助,如果您需要进一步的说明,请询问并提供您的代码的更多详细信息(如果可以的话)。
| 归档时间: |
|
| 查看次数: |
778 次 |
| 最近记录: |