当前位置: 首页 > 知识库问答 >
问题:

Laravel从包含null的两个表连接

宗政燕七
2023-03-14

我有3个表格列表,城市,州

列表表:

id city_id state_id...

列表模型:

class Listing extends Model{

function city(){
    return $this->belongsTo('App\Models\City');
}

function state(){
    return $this->belongsTo('App\Models\State');
}

列表迁移:

public function up(){
    Schema::create('listings', function (Blueprint $table) {
        $table->integer('id')->unsigned()->index()->unique()->autoIncrement();
        $table->integer('city_id')->nullable();
        $table->integer('state_id')->nullable();
        ....

city_id/state_id可为空!

城市表:

ID state_id名称...

城市模型:

class City extends Model{

    public function listings(){
        return $this->hasMany('App\Models\Listing');
    }

    function state(){
        return $this->belongsTo('App\Models\State');
    }

迁移:

public function up(){
    Schema::create('cities', function (Blueprint $table) {
        $table->integer('id')->unsigned()->index()->unique()->autoIncrement();
        $table->integer('state_id')->nullable();
        $table->string('name');

状态表:

ID名称...

型号:

class State extends Model{

    public function listings(){
        return $this->hasMany('App\Models\Listing');
    }

    function cities(){
        return $this->hasMany('App\Models\City');
    }

迁移:

public function up(){
    Schema::create('states', function (Blueprint $table) {
        $table->integer('id')->unsigned()->index()->unique()->autoIncrement();
        $table->string('name');

listings表具有指向state_idcity_id的外键。两者的关系是一个城市或州与多个列表。

city表也有外键state_id并将一个州与多个城市联系起来。

我想从statescities中选择所有内容,并从listings表中计算每个城市/州的行数,我可以:

foreach($listings as $listing){
    {{$listing->city or state . ' | ' . $listing->all (count listings for current city/state)}}
}

我所尝试的是:

        $locations = DB::table('listings')
        ->join('states', 'states.id', '=', 'listings.state_id')
        ->join('cities', 'cities.id', '=', 'listings.city_id')
        ->groupBy(['listings.city_id', 'listings.state_id' ])

        ->select(
                       'states.name.name as state',
                       'cities.name as city',
                       'states.id as state_id',
                       'city.id as city_id',
                       DB::raw("COUNT(listings.id) as countListings")
                   )->get();

问题是,我希望所有城市和州都在一个集合中,并为该城市/州提供另一个键/属性计数列表。

是城市还是州,没关系,我只想要他们的名字与计数列表。

我正在使用最新的Laravel版本与MySQL。

共有1个答案

皮安顺
2023-03-14

不确定它是否完全符合您的需要,但如果希望避免任何复杂的SQL查询和联合,可以执行以下操作:

$states = State::with(['listings', 'listings_count'])->get();
$cities = City::with(['listings', 'listings_count'])->get();

$locations = $states->merge($cities);

如果您的集合很大,就性能而言就不是那么好,但对于较小的集合仍然有用。

 类似资料:
  • 我想请你帮忙。我有两张桌子。在表1中,我有client_num和personal data。我想把tab1和tab2连接起来,其中也有client_nums,但一个客户机号可以在更多行上。本表2的第二列是以数字1-5写成的产品。 表1 CLIENT_NUM;性别 表2 CLIENT_NUM;产品 现在我只想要那些没有4号产品的客户 你能帮我一下吗?谢谢

  • 问题内容: a = [1,1,1,2,3,4,4] >>> b = [1,1,2,3,3,3,4] 请注意,这不是一个相同的问题: 两个列表的Python交集保持重复 因为即使列表a中有三个1,列表b中也只有两个,所以结果应该只有两个。 问题答案: 您可以使用此方法,当您使用交叉路口时,它将为每个元素提供在任一列表中找到的最低计数。 输出 :

  • 我在两个不同的数据库上有两个表: db1.1表1 db2.table2 当我使用以下SQL语法“内部联接”这些表时: 我得到了这样的结果: 如何获得这样的结果(DB2上没有状态的消息仍然会出现,但是SUM结果可以是零或空):

  • 我有两个不同的服务器和,现在我有中的和中的。我试图加入这两个表在MySQL像这样。 但是我犯了一个错误。这在MYSQL中是可能的。

  • 我想从两个表中删除相关的行。可能有外键,也可能没有。因此,可以肯定的是,我不想依赖外键及其在DELETE上的

  • 问题内容: 我有两个表,如下所示: 我想列出参加活动17的所有人(包括学生和教师)的名字。无论如何,我可以获得以下结果: 无需创建新表(仅使用表达式或派生关系的嵌套)? 在actid上加入JOIN会得到如下结果: 我想我需要一种串联形式? 问题答案: 您可能(或可能不需要)对ID不唯一的内容进行处理,例如