如何在Laravel5视图中使用pivot创建hasManyThrough关系的表单

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表上创建新关系.但后来由于显而易见的原因(我不知道如何解决)但无线电不知道要保持检查,我不知道如何在控制器中访问/更新.这也是正确的做法,或者我错了关系?

haa*_*kym 1

你说你正在处理一个有很多直通关系的关系,据我了解,这需要 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

如果您正在使用多对多,我认为您的数据库架构应该包含三个表:

dealsfaqs以及中间表deal_faq,第三个表名称遵循中间表的 laravel 约定,其中连接表的单数名称按字母顺序使用,中间使用下划线。该表deal_faq需要一个deal_idand faq_id

然后您将需要两个模型(只有两个,而不是三个)

DealFaq,具有以下关系方法:

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)

由于您没有展示太多代码,所以很难说,我做了很多假设。无论如何,希望这对您有所帮助,如果您需要进一步的说明,请询问并提供您的代码的更多详细信息(如果可以的话)。