سلام
فرض کنیم دو تا دیتابیس داریم
تو اولی که اصلی هست جدول یوزر قرار داره با یک جدول مطالب (جدول مطالب با جدول یوزر رابطه داره از طریق فیلد user_id)
حالا فرض کنیم تو دیتابیس دوم فقط یه جدول داریم که اونم جدول مطالب هست و دارای فیلد user_id هست.
خب در دیتابیس اول به راحتی میشه از جدول مطالب و کلید خارجی user_id به جدول یوزر متصل شد و اطلاعات کاربر مربوط به اون مطلب رو خواند
سوال اینجاست چطوری همین کار رو برای جدول مطالب در دیتابیس دیگه کنیم؟
یــــــــــــــــعــــــــــــــــنــــــــــــــــی بــــــــــــــــا اســــــــــــــــتــــــــــــــــفــــــــــــــــاده از مـــــــــــــــــــــــــــــــــــدل هــــــــــــــــــــــــــــــــا
چون تو دیتابیس دوم که جدول یوزر وجود نداره و این جدول کاربران فقط تو دیتابیس اول هست
سپاس
از اولی اطلاعات user رو بدست بیار و از این اطلاعات برای دومی استفاده به شرط اینکه user_id در دومی مقدارش صحیح باشه
کافیه توی مدل مطالب اینجوری بنویسین مثلا اسمش رو میذاریم Topic
class Topic extends Eloquent
{
public function users()
{
retrun $this->belongsToMany('App\User','database_dovom.user_id');
}
}
باید اسم دیتابیس (databese_dovom) رو به این شکلی کنار کلید خارجی رابطه بذارین
@tefo.ha27
@hesammousavi
@ali.bayat
@khanzadimahdi
@Alimotreb
ممنون از پاسخ شما
ببینید این بخش کانفیگ دیتابیس من هست :
'server1' => [
'driver' => 'mysql',
'host' => '127.0.0.1',
'port' => '3306',
'database' => 'my_db',
'username' => '',
'password' => '',
],
'server2' => [
'driver' => 'mysql',
'host' => '190.47.33.10',
'port' => '3306',
'database' => 'my_db',
'username' => '',
'password' => '',
],
'server3' => [
'driver' => 'mysql',
'host' => '130.46.44.5',
'port' => '3306',
'database' => 'my_db',
'username' => '',
'password' => '',
],
این مدل User هست که دیتابیسش در سرور اول قرار داره :
<?php
namespace App;
use App\Message;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
public function message() {
return $this->hasMany(Message::class);
}
}
این مدل Message هست که دیتابیسش در سرور دوم قرار داره :
<?php
namespace App;
use App\User;
use Illuminate\Database\Eloquent\Model;
class Message extends Model
{
public function user() {
return $this->belongsTo(User::class);
}
}
چون مدل User همیشه در سرور اصلی که همون سرور 1 هست قرار داره ولی در سرور 2 و یا بعدا سرور 3 ، سرور 4 و ... قرار هست از دیتابیس مربوط به مدل Message قرار داده شود پس باید از همه مدل های مربوط به Message در سرور های مختلف به مدل User در سرور اصلی یا همان سرور 1 بتوان ارتباط برقرار کرد.
ممنون میشم الان بفرمائید نوع ارتباط رو ؟
class Message extends Model
{
public function user() {
return $this->belongsTo(User::class, 'server1.user_id');
}
}
@tefo.ha27 این کدی هم که قرار دادم کار نکرد لطفا کمک کنید ممنون
از شما هم ممنون میشم یه راهنمایی کنید
@hesammousavi
@ali.bayat
@khanzadimahdi
@milad
سپاس
خیلی منطقی نیست برای یک اپلیکیشن از دو دیتابیس استفاده کنید.. چرا تمام داده هارو در ۱ دیتابیس نمیذارید؟
این طوری راحت تمام جدول ها هم با هم در ارتباطند
فکر کنم اصلا از connection استفاده نکردین
https://fideloper.com/laravel-multiple-database-connections?source=post_page-----d7e8dcb7ed2a----------------------
@ali.bayat خواسته من این نیست که شما بفرمائید که چرا دارم از دو الی چندین دیتابیس استفاده میکنم هدف من ارتباط یه جدول خارجی در دیتابیس خارجی با جدول اصلی در دیتابیس اصلی می باشد.
اگر در این مورد راه حلی دارید ممنون میشم ارائه بدید
@ali.bayat اون چیزی که @tefo.ha27 زحمت کشیدن و ارائه دادن رو هم تست کردم ولی جواب نداد متاسفانه!
منظورم اینه :
class Message extends Model
{
public function user() {
return $this->belongsTo(User::class, 'server1.user_id');
}
}
و اخطار زیر رو داد :
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'server3.users' doesn't exist (SQL: select * from `users` where `messages`.`id` in ())
یه بار دیگه توضیح بدم شاید بهتر بتونم مسئله رو بیان کنم تا دوستان راه حل ارائه بدن:
ببینید من فقط یک اسکریپت لاراول دارم و تمام مدل ها هم درون اون هستن، برای راحتی توضیح شما فرض کنید که من کلا دو تا جدول و دو تا مدل دارم
نکته 1 : مدل ها (هر دو مدل) در یک اسکریپت لاراول هستند (چون فقط یک اسکریپت وجود دارد)
نکته 2 : جدول messages هم در سرور اصلی (یعنی سرور 1) و هم در چندین دیتابیس و هر دیتابیس در سرور جداگانه می باشد.
مثلا :
Server1.mydb.messages
Server2.mydb.messages
Server3.mydb.messages
Server4.mydb.messages
و
...
نکته : حالا هدف من اینه تو اسکریپت لاراول وقتی لیست پیام ها رو میخام ببینم ابتدا انتخاب میکنم این پیام ها از کدوم جدول در کدوم دیتابیس و کدوم سرور میخوام لیست بشه و نمایش داده بشه که تا اینجا هیچ مشکلی وجود نداره و نمایش داده میشه
فقط مشکل اصلی بحث join و تابع with() هست که درست کار نمیکنه و فقط در دیتابیس اول درست کار میکنه چون توی دیتابیس اول جدول messages هم وجود داره و جدول users هم وجود داره
ولی تو سرور های دیگه فقط هر کدوم یه جدول دارن و اون هم messages هست و همه ی اونها باید باید با جدول users که فقط تو دیتابیس سرور شماره 1 هست رابطه برقرار کنند تا ببینم این پیام مربوط به کدام کاربر هست.
که وقتی جدول messages از سرور ها 2 و 3 و 4 و ... لیست میشن میخوام ببینم کاربرش چه کسی هست ارتباط برقرار نمیشه حتی با کدی که جناب @tefo.ha27 ارائه دادن
میخام به مدل Message بگم که اطلاعات کاربر فقط تو یه سرور هست اونم فقط سرور 1 هست و نباید دنبال جدول users تو سرور های 2 و 3 و 4 و ... بگرده ولی نمیدونم چطوری!
این کانفیگ دیتابیس من هست که تو پروژه اصلی لاراول هست که جدول users هم فقط همینجاست:
'server1' => [
'driver' => 'mysql',
'host' => '127.0.0.1',
'port' => '3306',
'database' => 'mydb',
'username' => '',
'password' => '',
],
'server2' => [
'driver' => 'mysql',
'host' => '190.47.33.10',
'port' => '3306',
'database' => 'mydb',
'username' => '',
'password' => '',
],
'server3' => [
'driver' => 'mysql',
'host' => '130.46.44.5',
'port' => '3306',
'database' => 'mydb',
'username' => '',
'password' => '',
],
'server4' => [
'driver' => 'mysql',
'host' => '177.50.88.15',
'port' => '3306',
'database' => 'mydb',
'username' => '',
'password' => '',
],
این مدل User هست که دیتابیسش فقط و فقط در سرور اول قرار داره :
<?php
namespace App;
use App\Message;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
public function message() {
return $this->hasMany(Message::class);
}
}
این مدل Message هست که مربوط به جدول messages هست که از این جدول در دیتابیس های همه ی سرور ها (سرور 1 و سرور 2 و سرور3 و سرور 4 و ...) قرار داره :
<?php
namespace App;
use App\User;
use Illuminate\Database\Eloquent\Model;
class Message extends Model
{
public function user() {
return $this->belongsTo(User::class);
}
}
حالا ممنونم میشم دوستان لطفی کنند و یه راه حل مناسب ارائه بدهند :
@tefo.ha27
@hesammousavi
@ali.bayat
@khanzadimahdi
@Alimotreb
ســــــــــــــــــــــــپـــــــــــــــــــاس
مدل ها به صورت پیش فرض فقط با دیتابیسی که توی فایل env هست ارتباط برقرار میکنه اگه میخاین اونو عوض کنین یا با متد setConnection رو ابجکت
یا اینکه توی مدل اتریبیوت connection رو عوض کنین
اینجا اصلا باید خودتون راه حلو پیدا کنین که چجوری تشخیص میدین اون user_id کجاست
این کد من معلومه ناقصه
class Message extends Model
{
public function user() {
return $this->belongsTo(User::class, 'server1.user_id');
}
}
چون اصلا توی سرور یک اصلا یوزر ایدی نداریم من اینو فقط بعنوان مثال عرض کردم چجوری سرور رو عوضش میکنین تنها کاری که باید بکنین اینه
server1.user_id
این server1 رو یه جوری به مدلتون پاس بدین
یا از لینک بالا استفاده کنین برای تعیین کانکشن
برای همین اقای @ali.bayat گفتن اصولی نیست یه مدل توی چند دیتابیس باشه
@tefo.ha27 خب مدل که یکی هست اگه توضیحات و خونده باشین همه چی معلومه الان من نیاز به یه حواب دارم که تو اون مدل Message
همیشه فانکشن مربوط به user ارتباط رو با با مدل یوزر سرور ۱ برقرار کنه
یعنی اینکه تابع user در مدل Message باید کانکشن رو فقط به سرور ۱ وصل کنه
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟