雄辩的渴望加载关系

如何解决雄辩的渴望加载关系

StackOverflow的朋友们大家好,希望大家度过美好的一天(˘⌣˘)♡(˘⌣˘)

我是Laravel的新手,目前正在学习雄辩的人际关系(hasMany)

很抱歉,这篇文章读得太久了,但是我想弄清楚自己遇到的每一个步骤,直到遇到问题为止,还对不起我的英语不好(⁄ ⁄•⁄ ω⁄•⁄ ⁄)

所以我们开始

在我的用户模型中

public function posts() {
    // A user can have many posts
    return $this->hasMany('App\Post');
}

在我的帖子模型中

public function owner()
{
    // A post belongs to a user
    return $this->belongsTo('App\User','user_id');
}

在我的帖子表中,我有3条简单记录

|----------------------------------------------------------|
| id |   user_id |   body          |    ...    |   ...     |
|  1 |   1       |   My first post |    ...    |   ...     |
|  2 |   1       |   Second post   |    ...    |   ...     |
|  3 |   1       |   Another post  |    ...    |   ...     |

然后让我们说,我们希望看到id = 1的用户及其创建的所有帖子,因此我使用以下代码:

// AccountController
public function profile($id)
{
    $user = App\User::with('posts')->findOrFail($id);
    return $user;
}

// Will return data:
{
    "id": 1,"name": "Prof. Angela Runte Jr.","email": "mborer@example.org",...
    "posts": [
        {
            "id": 1,"user_id": 1,"body": "My first post",...
        },{
            "id": 1,"body": "Second post","body": "Another post",...
        }
}

在Blade视图中,我可以简单地获取如下数据:

// in profile.blade.php

$user->name
$user->...

@foreach($user->posts as $post)
// Show each post data
@endforeach

它以我想要的方式完美运行,这要感谢泰勒·奥特威尔(Taylor Otwell)创建了一个了不起的框架(´•ω•`)♡

然后我想到一个主意,让我们创建一个功能,使用户可以发布给其他用户,为什么不呢?我们开始做吧! (✧ω✧)

因此,在我的Post迁移中,我更改了表架构:

发件人:

// Before
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->unsignBigInteger('user_id');

$table->text('body');
$table->timestamps();

收件人:

// After
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->unsignedBigInteger('user_id');

// New column: nullable()
$table->foreign('for_id')->references('id')->on('users')->onDelete('cascade');
$table->unsignedBigInteger('for_id')->nullable();

$table->text('body');
$table->timestamps();

如您所见,我将nullable()放在“ for_id”列中

换句话说,如果for_id为空,则该帖子仅属于发布该帖子的用户

否则,该帖子属于发布该帖子的用户以及目标用户(for_id)。

然后,我跑步

// I only use UserSeeder (wanna keep it simple tho)
php artisan migrate:fresh --seed

现在我们有2个ID为1和2的用户(是!)

|----------------------------------------------------------------------------------------|
| id |   name                    |   email                     |    ...     |    ...     |
|  1 |   Camden Kulas            |   lemke.fabian@example.net  |    ...     |    ...     |
|  2 |   Mrs. Roberta Stroman    |   ybartoletti@example.com   |    ...     |    ...     |

让我们使用修补程序来创建伪数据

php artisan tinker
>> $user = App\User::first();
=> App\User {#3910
       id: 1,name: "Camden Kulas",email: "lemke.fabian@example.net",...
   }
>> $user->posts()->create(['body' => 'New first post']);
=> App\Post {#4120
       body: "New first post",user_id: 1,updated_at: "2020-08-30 03:42:43",created_at: "2020-08-30 03:42:43",id: 1,}

// we create one for Mrs. Roberta Stroman (user with id #2)
>> $user->posts()->create(['for_id' => 2,'body' => 'Hello there']);
=> App\Post {#3912
       for_id: 2,body: "Hello there",updated_at: "2020-08-30 03:44:18",created_at: "2020-08-30 03:44:18",id: 2,}

所以现在我们的帖子表中有2条记录

|--------------------------------------------------------------------|
| id |   user_id |   for_id        |   body              |   ...     |
|  1 |   1       |   NULL          |   New first post    |   ...     |
|  2 |   1       |   2             |   Hello there       |   ...     |

我们仍处于用户ID#1

>> $user->posts

=> Illuminate\Database\Eloquent\Collection {#4120
       all: [
           App\Post {#4125
               id: 1,for_id: null,body: "New first post",...
           },App\Post {#4128
               id: 2,for_id: 2,],}

( ̄ω ̄)好的,到这里,一切正常,让我们尝试使用用户ID#2

在我看来,我希望获得用户ID为2,并且所有帖子都由ID为2,以及其他所有ID为2的帖子

>> $user = App\User::find(2);
=> App\User {#4121
       id: 2
       name: "Mrs. Roberta Stroman",email: "ybartoletti@example.com",...
   }
>> $user->posts
=> Illuminate\Database\Eloquent\Collection {#4067
       all: [],}

Σ(°ロ°)帖子是空的,那为什么它是空的?

ఠ͟ಠ然后我尝试使用with()

>> $user = App\User::with('posts')->find(2);
=> App\User {#4120
       id: 2,name: "Mrs. Roberta Stroman",...
       posts: Illuminate\Database\Eloquent\Collection {#4123
           all: [],},}

(ꐦ°᷄д°᷅)什么?为什么帖子仍然是空的? щ(ºДºщ)

因此,经过数天的搜索和阅读,我仍然不知道如何解决此问题(。╯︵╰。)

然后我尝试更改用户模型:posts()函数

发件人:

public function posts()
{
    // A post belongs to a user
    return $this->hasMany('App\Post');
}

收件人:

public function posts()
{
    // In my logic like:
    // Hey I want to fetch all posts that made by this user,**or where all posts that created by others for this user**
    // Make sense in human language right?
    return $this->hasMany('App\Post','user_id')->orWhere('posts.for_id',$this->id);
}

我退出了修补匠,然后再次进入修补匠

>> $user = App\User::first();
// return user id #1

>> $user->posts
// works fine,return all posts

(ಠ益ಠ)现在我面临其他问题

>> $user = App\User::with('posts')->first(); // notice that I'm using with()

// tinker return the desired user,and also return ONLY one post

>> App\User {#4123
       id: 1,....
       posts: Illuminate\Database\Eloquent\Collection {#4130
           all: [
               App\Post {#4128
                   id: 1,// where is the second post?
           ],}

然后我尝试使用用户ID#2更改修补匠会话

>> $user = App\User::find(2);
// return user id #2

>> $user = App\User::with('posts')->find(2);
// return user id #2,but no post (only array all)

因此,我无需再提出其他问题

[#1]为什么用户#1只获取一个帖子,而他却创建了2个帖子?

一篇文章没有for_id(NULL),第二篇文章有for_id

[#2]如何使用户ID#2来获取其所有帖子,以及为其创建的帖子?

因为用户模型中的IMHO posts()函数对我来说很有意义,但这不起作用

如果有不清楚的解释,它将及时进行编辑

预先感谢

更新

我发现可以这样简单地获取用户X的所有帖子和用户X的所有帖子:

$user = App\User::find(X);
$posts = $user->posts()->orWhere('for_id',X)->get();
return [
    'user' => $user,'posts => $posts
];

所以现在我想到了这个问题:

如何在$ posts中使用with()?

// Like this
$user = App\User::with('allposts')->find(X);
// Return user X and all posts made by X and posted to user X

// So I can simply get data in view like this:

@foreach ($user->allposts as $post)
// Loop all posts by user X and for user X
@endforeach

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-