如何返回所有包含空外键值的联接表

时间:2019-01-26 19:36:18

标签: mysql laravel-5

我想联接两个表,但它只会返回未为空的外键列

它只会显示所有如果我使用1作为默认值的所有值,并且不将任何东西放在外部id 1行中看起来像是空的,但是问题是,如果我更新具有默认1值的一行,它将更新所有具有1个值的外国编号,我不希望发生这种情况。

$unit = DB::table('franchises')
       ->join('units', 'franchises.id', '=', 'units.franchise_id')
       ->orderBy('units.created_at', 'desc')->paginate(20);

return view('register-unit', compact('unit'));

我有这个迁移查询

$table->integer('franchise_id')->unsigned()->default(null); 
$table->foreign('franchise_id')->references('id')->on('franchises')->onDelete('cascade')->onUpdate('cascade');

我希望它使所有外键默认为null,并且仍然可以使用join返回所有外键。我怎样才能做到?

1 个答案:

答案 0 :(得分:0)

您有一个关系,其中每个单位 都可以与一个专营权相关。您可以使用LEFT JOIN来将表格用作起点,并可以选择与另一张桌子匹配。如果关系不匹配,则第二个查询的列将为空。

实际上,您的查询将返回与单位有关的所有特许经营权。您可以将该关系设置为可选。

DB::table('franchises')
    ->leftJoin('units', 'franchises.id', '=', 'units.franchise_id')
    ->orderBy('units.created_at', 'desc')->paginate(20);

但是由于您已将变量unit命名,并且也按units.created_at对查询结果进行了排序,所以我认为您希望提取所有单位,并可选地提取相应的专营权。如果是这样,您应该以其他方式LEFT JOIN

DB::table('units')
    ->leftJoin('franchises', 'franchises.id', '=', 'units.franchise_id')
    ->orderBy('units.created_at', 'desc')
    ->paginate(20);